关联列表中的两个项目

时间:2018-09-18 15:36:23

标签: python list

我正在比较两个列表中的常见字符串,并且我的代码当前可以从两个列表中输出相同的项目。

list1

['5', 'orange', '20', 'apple', '50', 'blender']

list2

['25', 'blender', '20', 'pear', '40', 'spatula']

到目前为止,这是我的代码:

for item1 in list1[1::2]:
    for item2 in list2[1::2]:
        if item1 == item2:
            print(item1)

此代码将返回Blender。我现在想做的就是在每个列表中的搅拌器之前打印数字,以获得类似于以下内容的输出:

blender, 50, 25

我试图在for循环中添加两行,但没有所需的输出:

for item1 in list1[1::2]:
    for item2 in list2[1::2]:
        for num1 in list1[0::2]:
            for num2 in list2[0::2]:
               if item1 == item2:
                   print(item1, num1, num2)

我现在知道进行循环不是答案。也尝试调用item1 [-1]不起作用。我是Python新手,需要一些帮助!

谢谢

6 个答案:

答案 0 :(得分:14)

您可以通过两种方式来做到这一点,要么停留在列表中(哪个更混乱):

list1 = ['5', 'orange', '20', 'apple', '50', 'blender']
list2 = ['25', 'blender', '20', 'pear', '40', 'spatula']
for item1 in list1[1::2]:
  for item2 in list2[1::2]:
    if item1 == item2:
       item_to_print = item1
       print(item1, ",", end="")
       for index in range(len(list1)):
           if list1[index] == item1:
               print(list1[index - 1], ",", end="")
       for index in range(len(list2)):
           if list2[index] == item1:
               print(list2[index - 1])

或更好的方法(在我看来)是字典:

dict1 = {'apple': '20', 'blender': '50', 'orange': '5'}
dict2 = {'blender': '25', 'pear': '20', 'spatula': '40'}
for item in dict1:
   if item in dict2:
       print(item, ",", dict1[item], ",", dict2[item])

两者都会输出:

>> blender , 50 , 25

答案 1 :(得分:12)

您正在使用错误的数据结构来解决此问题。如果要在两者之间进行查找,则不应将这些数据保留在列表中。相反,在这里使用字典会容易得多。

设置

您可以使用zip创建这两个词典:

a = ['5', 'orange', '20', 'apple', '50', 'blender']
b = ['25', 'blender', '20', 'pear', '40', 'spatula']

dct_a = dict(zip(a[1::2], a[::2]))
dct_b = dict(zip(b[1::2], b[::2]))

这将使您拥有以下两个词典:

{'orange': '5', 'apple': '20', 'blender': '50'}
{'blender': '25', 'pear': '20', 'spatula': '40'}

这使问题的每个部分都更容易解决。例如,要查找公用密钥:

common = dct_a.keys() & dct_b.keys()
# {'blender'}

并查找与每个公用密钥匹配的所有值:

[(k, dct_a[k], dct_b[k]) for k in common]

输出:

[('blender', '50', '25')]

答案 2 :(得分:5)

我认为您更适合使用字典解决此问题。

dict1 = {'orange': 5, 'apple': 20, 'blender': 50}
dict2 = {'blender': 25, 'pear': 20, 'spatula': 40}

因此获得所需的输出

>>dict1['blender']
50
>>dict2['blender']
25

因此,如果您想以所需的格式从每个词典中获得搅拌机的数量,则可以真正使用

print("blender, "+str(dict1['blender'])+", "+str(dict2['blender']))

要更进一步,并根据dict1dict2中的内容进行输出

for i in dict1.keys(): #dict1.keys() is essentially a list with ['orange','apple','blender']
    if i in dict2.keys(): #same deal, but different items in the list
        print(str(i)+", "+str(dict1[i])+", "+str(dict2[i])) #this outputs items that are in BOTH lists
    else:
        print(str(i)+", "+str(dict1[i])) #this outputs items ONLY in dict1
for i in dict2.keys():
    if i not in dict1.keys(): #we use not since we already output the matching in the previous loop
        print(str(i)+", "+str(dict2[i])) #this outputs items ONLY in dict2

输出:

orange, 5
apple, 20
blender, 50, 25
pear, 20
spatula, 40

答案 3 :(得分:5)

使用enumerate,您可以解决问题:

list1 = ['5', 'orange', '20', 'apple', '50', 'blender']
list2 = ['25', 'blender', '20', 'pear', '40', 'spatula']



for n1, item1 in enumerate(list1[1::2]):
    for n2, item2 in enumerate(list2[1::2]):
        if item1 == item2:
            print(list1[n1*2], list2[n2*2], item1)

enumerate返回一个tuple,其中第一个元素是迭代计数,第二个元素是迭代计数。
由于enumerate正在计算迭代次数,而您正在执行第2步,我们需要乘以2:
orange将是第一个迭代,因此n1将是0,因此前一个值位于索引0*2
apple将在第二次迭代中,因此n1将为1,因此前一个值位于索引1*2
blender将在第三次迭代中,因此n1将为2,因此先前的值位于索引2*2处。

这意味着在for n1, item1 in enumerate(list1[1::2]): n1item1中将具有以下值:

  

迭代1:n1 = 0,item1 =橙色,previous_index = 0 * 2
  迭代2:n1​​ = 1,item1 =苹果,previous_index = 1 * 2
  迭代3:n1 = 2,item1 =混合器,previous_index = 2 * 2

for n2, item2 in enumerate(list2[1::2]):也一样:

  

迭代1:n2 = 0,item2 =混合器,previous_index = 0 * 2
  迭代2:n2 = 1,item2 =梨,previous_index = 1 * 2
  迭代3:n2 = 2,item2 =铲形,previous_index = 2 * 2

答案 4 :(得分:4)

假设列表中的名词是唯一的(每个列表),请首先从列表中创建字典。

In [1]: list1 = ['5', 'orange', '20', 'apple', '50', 'blender']
In [2]: list2 = ['25', 'blender', '20', 'pear', '40', 'spatula']
In [3]: 
In [3]: dict1 = dict(reversed(pair) for pair in zip(*[iter(list1)]*2))
In [4]: dict2 = dict(reversed(pair) for pair in zip(*[iter(list2)]*2))
In [5]: 
In [5]: dict1
Out[5]: {'apple': '20', 'blender': '50', 'orange': '5'}
In [6]: dict2
Out[6]: {'blender': '25', 'pear': '20', 'spatula': '40'}

此代码利用了itertools docs中的grouper配方。

匹配字典中的两项非常容易。

In [7]: key = 'blender'
In [8]: print(key, dict1[key], dict2[key])
blender 50 25

您甚至可以构建一个字典,其中包含dict1dict2的公用键以及值列表。

In [12]: common = dict1.keys() & dict2
In [13]: {c:[dict1[c], dict2[c]] for c in common}
Out[13]: {'blender': ['50', '25']}

对于任意数量的字典,您可以进一步对此进行抽象。

In [28]: from functools import reduce
In [29]: from operator import and_
In [30]: 
In [30]: dicts = (dict1, dict2)
In [31]: common = reduce(and_, map(set, dicts))
In [32]: {c:[d[c] for d in dicts] for c in common}
Out[32]: {'blender': ['50', '25']}

答案 5 :(得分:3)

我希望这段代码对您有用。

l1 =['5', 'orange', '20', 'apple', '50', 'blender']
l2 = ['25', 'blender', '20', 'pear', '40', 'spatula']

for list1_item in zip(*[iter(l1)]*2):
    for list2_item in zip(*[iter(l2)]*2):
        if list1_item[1]==list2_item[1]:
            print list1_item[1],list1_item[0],list2_item[0]

它将打印输出

blender 50 25