加入在Python中具有第一个相等值的n列表

时间:2018-01-03 19:52:30

标签: python list

我应该加入所有具有第一个共同价值的列表,这些列表包含一个唯一的列表,包含该值(不重复)以及所有其他值:

[
  ['time', 'free'],
  ['time', 'first'],
  ['visit', 'last'],
  ['city', 'small'],
  ['city', 'entire'],
  ['world', 'surreal'],
  ['world', 'amazing'],
]

我想有这样的事情:

[
  ['time','free','first'],
  ['visit','last'],
  ['city','small', 'entire'],
  ['world','surreal', 'amazing'],
]

如果可能的话我不会使用模块,因为它是一个无人的项目。 提前致谢

7 个答案:

答案 0 :(得分:1)

由于您的子列表按第一个元素分组,因此使用itertools.groupby简化了您的解决方案。

r = [[i] + [y[1] for y in g] for i, g in itertools.groupby(l, key=lambda x: x[0])]

print(r)
[['time', 'free', 'first'],
 ['visit', 'last'],
 ['city', 'small', 'entire'],
 ['world', 'surreal', 'amazing']]

l是您的清单。我们在这里做的是

  1. 按第一个元素分组
  2. 对于每个组,从每行中提取第二个元素并形成一个列表。
  3. 这个循环等价于 -

    r = []
    for for i, g in itertools.groupby(l, key=lambda x: x[0]):
        i = [i]                 # converting the string key to a list
        j = [y[1] for y in g]   # extracting the second element from the `grouper` object
    
        r.append(i + j)         # concatenating `i` and `j` and adding it to our result
    

    对于踢球,这里的熊猫相当于这个功能。成语是相同的 - 分裂+应用+结合。

    v = pd.DataFrame(l, columns=['A', 'B'])\
               .groupby('A', sort=False).B.apply(list)
    
    r = pd.DataFrame(v.tolist(), index=v.index).reset_index().values.tolist()
    

    print(r)
    [['time', 'free', 'first'],
     ['visit', 'last', None],
     ['city', 'small', 'entire'],
     ['world', 'surreal', 'amazing']]
    

答案 1 :(得分:1)

有很多方法可以做到这一点,使用dict是设计好的,也很容易阅读:

l = [
    ['time', 'free'],
    ['time', 'first'],
    ['visit', 'last'],
    ['city', 'small'],
    ['city', 'entire'],
    ['world', 'surreal'],
    ['world', 'amazing'],
]

d = dict()
for item in l:
    try:
        d[item[0]] += item[1:]
    except KeyError:
        d[item[0]] = item[1:]

result = [[key] + value for key, value in d.items()]
print(result)  # [['time', 'free', 'first'], ['visit', 'last'], ['city', 'small', 'entire'], ['world', 'surreal', 'amazing']]

答案 2 :(得分:1)

以下是使用OrderedDict保留顺序的解决方案:

from collections import OrderedDict

l = [
  ['time', 'free'],
  ['time', 'first'],
  ['visit', 'last'],
  ['city', 'small'],
  ['city', 'entire'],
  ['world', 'surreal'],
  ['world', 'amazing'],
]

d = OrderedDict()

for k,v in l:
    d.setdefault(k, []).append(v)

output = [[k]+v for k,v in d.items()]

使用pandas(仅因为:))

import pandas as pd

l = [
  ['time', 'free'],
  ['time', 'first'],
  ['visit', 'last'],
  ['city', 'small'],
  ['city', 'entire'],
  ['world', 'surreal'],
  ['world', 'amazing'],
]

output = [[k]+v for k,v in pd.DataFrame(l).groupby(0)[1].apply(list).to_dict().items()]

答案 3 :(得分:0)

您可以使用itertools.groupby

import itertools
s = [
 ['time', 'free'],
 ['time', 'first'],
 ['visit', 'last'],
 ['city', 'small'],
 ['city', 'entire'],
 ['world', 'surreal'],
 ['world', 'amazing'],
]
new_data = [[[a]+[b for c, b in list(b)]][0] for a, b in itertools.groupby(sorted(s, key=lambda x:x[0]), key=lambda x:x[0])]

输出:

[['city', 'small', 'entire'], ['time', 'free', 'first'], ['visit', 'last'], ['world', 'surreal', 'amazing']]

答案 4 :(得分:0)

不是最好的方法,但没有使用库:

l = [...] # Your list
d = {}

for key, value in l:
    if key in d:
        d[key].append(value)
    else:
        d[key] = [value]

print([[key] + value for key, value in d.items()])

这基本上将第一项存储为字典键,列表中的第二项附加到对应键(第一项)中的列表中。

然后最后一行展平字典并打印出来。

答案 5 :(得分:0)

简单循环解决方案,根据需要启动新组:

groups = []
for a, b in items:
    if not groups or a != groups[-1][0]:
        groups.append([a])
    groups[-1].append(b)

一个dict解决方案受到其他人的启发(这可能" shuffle"结果列表,除非你使用CPython 3.6+或其他Python来保持插入顺序的dicts):

d = {}
for a, b in items:
    d.setdefault(a, [a]).append(b)
groups = list(d.values())

答案 6 :(得分:0)

你可以试试这个:

data=[
  ['time', 'free'],
  ['time', 'first'],
  ['visit', 'last'],
  ['city', 'small'],
  ['city', 'entire'],
  ['world', 'surreal'],
  ['world', 'amazing'],
]


group={}

for i in data:
    if i[0] not in group:
        group[i[0]]=i
    else:
        group[i[0]].extend([i[1]])

print(group.values())

如果订单不重要,那么你可以试试这个:

data=[
  ['time', 'free'],
  ['time', 'first'],
  ['visit', 'last'],
  ['city', 'small'],
  ['city', 'entire'],
  ['world', 'surreal'],
  ['world', 'amazing'],
]


group={}

for i in data:
    if i[0] not in group:
        group[i[0]]=i
    else:
        group[i[0]].extend(i)

print(list(map(lambda x:set(group[x]),group.keys())))

输出:

[{'surreal', 'amazing', 'world'}, {'entire', 'small', 'city'}, {'free', 'time', 'first'}, {'last', 'visit'}]

默认dict版本: