为了账号安全,请及时绑定邮箱和手机立即绑定

合并具有公共元素值的列表而不对其进行排序

合并具有公共元素值的列表而不对其进行排序

智慧大石 2021-08-14 15:35:35
我的问题是我有一个 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]]


查看完整回答
反对 回复 2021-08-14
  • 1 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信