我的问题是我有一个 nested listl = [ ['a','apple',1], ['b', 'banana', 0], ['a', 'artichoke', 'antenna'], ['b', 'brocolli', 'baton'], ['c', None, 22] ]并且我想合并那些list具有共同索引值的内容,而不对结果列表进行排序。我的首选输出:[ ['a','apple', 1, 'artichoke', 'antenna'], ['b', 'banana', 0, 'brocolli', 'baton'], ['c', None, 22]]我从这里和这里找到了解决方案 但是我得到的输出以某种方式排序,这涉及到我当前的输出:[['c', None, 22], [1, 'antenna', 'apple', 'artichoke', 'a'], [0, 'b', 'banana', 'brocolli', 'baton']]我的代码是:len_l = len(l)i = 0while i < (len_l - 1): for j in range(i + 1, len_l): # i,j iterate over all pairs of l's elements including new # elements from merged pairs. We use len_l because len(l) # may change as we iterate i_set = set(l[i]) j_set = set(l[j]) if len(i_set.intersection(j_set)) > 0: # Remove these two from list l.pop(j) l.pop(i) # Merge them and append to the orig. list ij_union = list(i_set.union(j_set)) l.append(ij_union) # len(l) has changed len_l -= 1 # adjust 'i' because elements shifted i -= 1 # abort inner loop, continue with next l[i] break i += 1print(l)我很感激这里的帮助,我也愿意接受关于如何以更简单的方式做到这一点的新建议,因为老实说,我以前从未使用过union()Norintersection()方法。谢谢
1 回答
米琪卡哇伊
TA贡献1998条经验 获得超6个赞
您可以使用以每个列表的第一个元素作为键的字典,并在每次在列表列表中遇到时扩展列表,例如:
data = [
['a','apple',1],
['b', 'banana', 0],
['a', 'artichoke', 'antenna'],
['b', 'brocolli', 'baton'],
['c', None, 22]
]
然后我们:
d = {}
for k, *vals in data:
d.setdefault(k, []).extend(vals)
d = collections.OrderedDict()如果完全有必要保证键的顺序如列表中所示,您可以选择在此处使用。
这给了你一个d:
{'a': ['apple', 1, 'artichoke', 'antenna'],
'b': ['banana', 0, 'brocolli', 'baton'],
'c': [None, 22]}
如果您然后想解压回列表列表(尽管它可能更有用 a dict),那么您可以这样做:
new_data = [[k, *v] for k, v in d.items()]
要得到:
[['a', 'apple', 1, 'artichoke', 'antenna'],
['b', 'banana', 0, 'brocolli', 'baton'],
['c', None, 22]]
添加回答
举报
0/150
提交
取消