在Python中将一个列表的元素与另一个列表匹配,跳过已匹配的元素

1 投票
1 回答
1057 浏览
提问于 2025-04-17 03:45

这个问题的解决办法对很多人来说可能很明显,但我现在卡住了,所以想请教一下。

我有两个列表,格式如下:

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_itemstarget_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 个回答

2

在编程中,有时候我们会遇到一些问题,可能是因为代码写得不够好,或者是我们对某些概念理解得不够透彻。比如,有人可能会在使用某个功能时,发现它并没有按照预期的方式工作。这时候,我们就需要仔细检查代码,看看是不是哪里出了问题。

有些时候,问题可能出在我们对某个工具或库的使用上。比如,我们可能没有正确地调用某个函数,或者没有传递正确的参数。理解这些工具的使用方法非常重要,这样才能避免常见的错误。

此外,查看其他人的经验和解决方案也是一个很好的学习方式。很多时候,别人遇到过类似的问题,他们的解决方案可能会给我们带来启发。

总之,编程是一项需要不断学习和实践的技能。遇到问题时,不要气馁,仔细分析,寻找解决方案,慢慢你就会变得越来越熟练。

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()

撰写回答