Python匹配列表列表中的元素并组合成单个集合

时间:2018-01-04 20:12:11

标签: python-3.x list matching

我有数据,我在列表中的列表中存储了一组值。这些列表将主要包含唯一数据,但保证一个元素与另一个列表中的一个元素相同。我要做的是迭代这些列表(没有设置列表总数),使用共享元素匹配两个嵌套列表,然后组合这两个列表。这需要对列表中的每个列表进行。

示例:

my_list = [[1, 2, 3, 4, Hello], [5, 6, 7, 8, Hello], 
          [9, 10, 11, 12, Bye], [13, 14, 15, 16, Bye], 
          [17, 18, 19, 20, Python], [21, 22, 23, 24, Python]]

期望的结果:

my_list1 = [1, 2, 3, 4, Hello, 5, 6, 7, 8, Hello]
my_list2 = [9, 10, 11, 12, Bye, 13, 14, 15, 16, Bye]
my_list3 = [17, 18, 19, 20, Python, 21, 22, 23, 24, Python]
....

在这种情况下,他们将匹配Hello,Bye和Python。匹配列表不一定立即相互跟随。

我找到了一些在列表列表中搜索匹配元素的方法,但它们似乎正在寻找和拉动共享元素,我找不到合并两个集合的方法。

我是Python的新手,所以虽然我知道我想要它做什么,但我不知道我是否走正确的道路,如果Python有这样做的功能,那么任何帮助都会很大赞赏。

谢谢,

编辑: 它始终是每个列表中最后一个匹配值的元素,列表将始终以这种格式构建而不是随机的

1 个答案:

答案 0 :(得分:1)

my_list = [[1, 2, 3, 4, "Hello"], [5, 6, 7, 8, "Hello"], 
          [9, 10, 11, 12, "Bye"], [13, 14, 15, 16, "Bye"], 
          [17, 18, 19, 20, "Python"], [21, 22, 23, 24, "Python"]]

@JonClements更快的方式:

d = {} 
for lst in my_list: 
    d.setdefault(lst[-1], []).extend(lst)    

print(d.values)

https://docs.python.org/3/library/stdtypes.html#dict

  • dictionary.setDefault(key,defaultValueIfKeyNotPresent)返回键值(如果已存在于词典中),否则使用给定的
  • 创建键
  • defaultValueIfKeyNotPresent(如果没有明确说明,则为None)。 .extend(lst)是列表上的一种方便方法,它通过其他可迭代的方式扩展了列表。

他还提出了使用itertools和lambda的另一种方法 - 请参阅注释。

我的一步一步:

results = []
for n in set(x[-1] for x in my_list): # just get all last elements as set
    sameLastElement = [x for x in my_list if x[-1] == n] # get all sublists that match
    same = [] # accumulate sub lists into one list
    for a in sameLastElement:
        same +=  a
    results.append(same) # put into result array

print (results) # done

输出 - 必须将最后一个元素更改为字符串:

[[1, 2, 3, 4, 'Hello', 5, 6, 7, 8, 'Hello'], 
 [9, 10, 11, 12, 'Bye', 13, 14, 15, 16, 'Bye'], 
 [17, 18, 19, 20, 'Python', 21, 22, 23, 24, 'Python']]

如果您知道其中有多少,或者只是遍历所有合并的子列表,您可以解构此result

list_a, list_b, list_c = results

for n in results:
    # do smth with each single merged list