在Python中将一个列表的元素与另一个列表匹配,跳过已匹配的元素
这个问题的解决办法对很多人来说可能很明显,但我现在卡住了,所以想请教一下。
我有两个列表,格式如下:
target_list =['apples 1', 'oranges 1', 'bananas 2', 'apples 3', 'oranges 2','mango 3', 'apples 2']
source_list = ['A apples', 'B mango', 'C apples', 'D bananas', 'E oranges','F apples', 'G oranges']
我需要遍历每一个 target_items
在 target_list
中,如果 target_item()[0]
和 source_item()[1]
在 source_list
中匹配,就返回 target_item()[0],source_item()[0], target_item()[1]
。输出中不能有重复的 source_item/target_item 对。
我来举个例子。假设我用一个普通的 for 循环:
for target_item in target_list:
for source_item in source_list:
if source_item.split()[1] == target_item.split()[0]:
print target_item.split()[0], source_item.split()[0], target_item.split()[1]
但我得到的(错误的)输出是:
apples A 1
apples C 1
apples F 1
oranges E 1
oranges G 1
bananas D 2
apples A 3
apples C 3
apples F 3
oranges E 2
oranges G 2
mango B 3
apples A 2
apples C 2
apples F 2
注意到 source/target 对 apple A、apples C、apples F 各出现了 3 次,每次的数字不同。橙子的对也是如此。我需要的结果是:
apples A 1
apples C 2
apples F 3
oranges E 1
oranges G 2
bananas D 2
mango B 3
也就是说,每一条记录应该始终有不同的 source 和 target。
另外,对于每一组 'apple $ LETTER' 和 'orange $LETTER' 的对,即使数字标签的顺序不同,也没关系。所以,以下的输出也是可以接受的:
apples A 2
apples C 1
apples F 3
oranges E 2
oranges G 1
bananas D 2
mango B 3
1 个回答
在编程中,有时候我们会遇到一些问题,可能是因为代码写得不够好,或者是我们对某些概念理解得不够透彻。比如,有人可能会在使用某个功能时,发现它并没有按照预期的方式工作。这时候,我们就需要仔细检查代码,看看是不是哪里出了问题。
有些时候,问题可能出在我们对某个工具或库的使用上。比如,我们可能没有正确地调用某个函数,或者没有传递正确的参数。理解这些工具的使用方法非常重要,这样才能避免常见的错误。
此外,查看其他人的经验和解决方案也是一个很好的学习方式。很多时候,别人遇到过类似的问题,他们的解决方案可能会给我们带来启发。
总之,编程是一项需要不断学习和实践的技能。遇到问题时,不要气馁,仔细分析,寻找解决方案,慢慢你就会变得越来越熟练。
target_list =['apples 1', 'oranges 1', 'bananas 2', 'apples 3', 'oranges 2','mango 3', 'apples 2']
source_list = ['A apples', 'B mango', 'C apples', 'D bananas', 'E oranges','F apples', 'G oranges']
from collections import defaultdict
# you want each target fruit to be a group, so use them as keys in a dict
# use a defaultdict list so whenever you access a key that doesn't exist
# it creates an empty list at that key
td = defaultdict(list)
for item in target_list:
key, value = item.split()
# the value for each fruit is a list of the numbers associated with it
td[key].append(value)
# for each source item find a match and pop a number from the list
# so that each pair gets a different number
for item in source_list:
letter, key = item.split()
if key in td:
print key, letter, td[key].pop()