我应该加入所有具有第一个共同价值的列表,这些列表包含一个唯一的列表,包含该值(不重复)以及所有其他值:
[
['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'],
]
如果可能的话我不会使用模块,因为它是一个无人的项目。 提前致谢
答案 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
是您的清单。我们在这里做的是
这个循环等价于 -
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版本: