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

我的问题是我有一个 nested list


l = [

     ['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 = 0

while 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 += 1

print(l)

我很感激这里的帮助,我也愿意接受关于如何以更简单的方式做到这一点的新建议,因为老实说,我以前从未使用过union()Norintersection()方法。谢谢


智慧大石
浏览 133回答 1
1回答

米琪卡哇伊

您可以使用以每个列表的第一个元素作为键的字典,并在每次在列表列表中遇到时扩展列表,例如:data = [&nbsp; &nbsp; ['a','apple',1],&nbsp; &nbsp; ['b', 'banana', 0],&nbsp;&nbsp; &nbsp; ['a', 'artichoke', 'antenna'],&nbsp;&nbsp; &nbsp; ['b', 'brocolli', 'baton'],&nbsp; &nbsp; ['c', None, 22]]然后我们:d = {}&nbsp;for k, *vals in data:&nbsp; &nbsp; d.setdefault(k, []).extend(vals)d = collections.OrderedDict()如果完全有必要保证键的顺序如列表中所示,您可以选择在此处使用。这给了你一个d:{'a': ['apple', 1, 'artichoke', 'antenna'],&nbsp;'b': ['banana', 0, 'brocolli', 'baton'],&nbsp;'c': [None, 22]}如果您然后想解压回列表列表(尽管它可能更有用 a dict),那么您可以这样做:new_data = [[k, *v] for k, v in d.items()]要得到:[['a', 'apple', 1, 'artichoke', 'antenna'],&nbsp;['b', 'banana', 0, 'brocolli', 'baton'],&nbsp;['c', None, 22]]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python