我有数据,我在列表中的列表中存储了一组值。这些列表将主要包含唯一数据,但保证一个元素与另一个列表中的一个元素相同。我要做的是迭代这些列表(没有设置列表总数),使用共享元素匹配两个嵌套列表,然后组合这两个列表。这需要对列表中的每个列表进行。
示例:
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有这样做的功能,那么任何帮助都会很大赞赏。
谢谢,
编辑: 它始终是每个列表中最后一个匹配值的元素,列表将始终以这种格式构建而不是随机的
答案 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