2011-10-05 158 views
1

解决方案很可能对您很多人都是显而易见的,但我卡住了,所以我想我会问。匹配从一个列表到另一个列表中的元素,跳过已匹配的元素,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_listsource_item()[1]return 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 

注意,源/目标对苹果,苹果C,苹果F被重复每次使用不同的号码3次。橙子对也是如此。我需要的是

apples A 1 
apples C 2 
apples F 3 
oranges E 1 
oranges G 2 
bananas D 2 
mango B 3 

即,每个条目应始终有不同的来源和目标。

此外,对于'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 

回答

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

很不错的。谢谢! – Renklauf

相关问题