循环遍历两个列表,其中一个小于另一个

时间:2018-06-11 12:02:19

标签: python

我有两个列表,其中一个列表是元组列表(将其称为list2),另一个列表是字符串列表(将其称为list1)。

list1小于list2,但我希望能够遍历它们并比较list1中每个元组中list2的值。

到目前为止,我一直在设法获得结果,但它没有正确的顺序。

到目前为止我的代码是;

list1 = ['2018-24', '2018-23', '2018-22', '2018-21', '2018-20', '2018-19', '2018-18', '2018-17', '2018-16', '2018-15', '2018-14', '2018-13', '2018-12', '2018-11']

list2 = [(27, 'Deutsche Bank', 'Opportunities email 2018-7'), (5, 'Deutsche Bank', 'Opportunities email 2018-2'), (4, 'Deutsche Bank', 'Opportunities email 2018-6'), (3, 'Deutsche Bank', 'Opportunities email 2018-10'), (3, 'Deutsche Bank', 'Opportunities email 2018-14'), (3, 'Deutsche Bank', 'Opportunities email 2017-50'), (3, 'Deutsche Bank', 'Opportunities email 2018-12'), (3, 'Deutsche Bank', 'Opportunities email 2018-4'), (2, 'Deutsche Bank', 'Opportunities email 2018-5'), (2, 'Deutsche Bank', 'Opportunities email 2018-3'), (2, 'Deutsche Bank', 'Opportunities email 2017-51'), (1, 'Deutsche Bank', 'Opportunities email 2018-13'), (1, 'Deutsche Bank', 'Opportunities email 2018-11')]

new_list = []

for x in list2:
    ii = x[2].split(' ')[2]
    if ii not in list1:
        new_list.append(0)
    else:

        print('This is ii ' + ii)
        for y in list1:
            if ii in y:
                new_list.append(x[0]) 
print(new_list)
print(len(new_list))
print(len(list1))
o/p > 
'This is ii 2018-14'
'This is ii 2018-13'
'This is ii 2018-12'
'This is ii 2018-11'
[0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 1, 1]
13
14

从上面可以看出,new_listlist1的len是不同的,它们应该是相同的。但也可以看出new_list的顺序与list1值不匹配,因此例如new_list的索引3处的值实际上应该在索引10处。我不确定为什么它似乎重新排序new_list

我期望获得的输出new_listlist1长度相同,但也有相应的值,例如ii in y为真且{{1} }} ii然后在考虑2018-14new_list的索引10时,值分别应为list13,这是预期的另一个示例如果考虑2018-14new_list的索引0,则输出分别应为list10

下面列出了预期产出的完整细目;

2018-7

4 个答案:

答案 0 :(得分:1)

假设list2的第三个元素中没有重复,我倾向于将它们放入将日期映射到数字的字典中。然后,您可以遍历list1并从字典中获取这些数字,如果日期不存在,则使用0作为后备值。

d = {description.split(' ')[2]: number for number, _, description in list2}
result = [d.get(date, 0) for date in list1]
print(result)

结果:

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 3, 1]

答案 1 :(得分:0)

list1 = ['2018-24', '2018-23', '2018-22', '2018-21', '2018-20', '2018-19', '2018-18', '2018-17', '2018-16', '2018-15', '2018-14', '2018-13', '2018-12', '2018-11']
list2 = [(27, 'Deutsche Bank', 'Opportunities email 2018-7'), (5, 'Deutsche Bank', 'Opportunities email 2018-2'), (4, 'Deutsche Bank', 'Opportunities email 2018-6'), (3, 'Deutsche Bank', 'Opportunities email 2018-10'), (3, 'Deutsche Bank', 'Opportunities email 2018-14'), (3, 'Deutsche Bank', 'Opportunities email 2017-50'), (3, 'Deutsche Bank', 'Opportunities email 2018-12'), (3, 'Deutsche Bank', 'Opportunities email 2018-4'), (2, 'Deutsche Bank', 'Opportunities email 2018-5'), (2, 'Deutsche Bank', 'Opportunities email 2018-3'), (2, 'Deutsche Bank', 'Opportunities email 2017-51'), (1, 'Deutsche Bank', 'Opportunities email 2018-13'), (1, 'Deutsche Bank', 'Opportunities email 2018-11')]
new_list = []

for x in range(len(list1)):
    try:
        ii = list2[x][2].split(' ')[2]
        if ii not in list1:
            new_list.append(0)
        else:

            print('This is ii ' + ii)
            for y in list1:
                if ii in y:
                    new_list.append(list2[x][0])
    except IndexError:
        new_list.append(0)
print(new_list)
print(len(new_list))
print(len(list1))
print(len(list2))

答案 2 :(得分:0)

list1 = ['2018-24', '2018-23', '2018-22', '2018-21', '2018-20', '2018-19', '2018-18', '2018-17', '2018-16', '2018-15', '2018-14', '2018-13', '2018-12', '2018-11']

list2 = [(27, 'Deutsche Bank', 'Opportunities email 2018-7'), (5, 'Deutsche Bank', 'Opportunities email 2018-2'), (4, 'Deutsche Bank', 'Opportunities email 2018-6'), (3, 'Deutsche Bank', 'Opportunities email 2018-10'), (3, 'Deutsche Bank', 'Opportunities email 2018-14'), (3, 'Deutsche Bank', 'Opportunities email 2017-50'), (3, 'Deutsche Bank', 'Opportunities email 2018-12'), (3, 'Deutsche Bank', 'Opportunities email 2018-4'), (2, 'Deutsche Bank', 'Opportunities email 2018-5'), (2, 'Deutsche Bank', 'Opportunities email 2018-3'), (2, 'Deutsche Bank', 'Opportunities email 2017-51'), (1, 'Deutsche Bank', 'Opportunities email 2018-13'), (1, 'Deutsche Bank', 'Opportunities email 2018-11')]

new_list = [0]*len(list1)

for x in list2:
    i = x[2].split(' ')[2]
    if i in list1:
        new_list[list1.index(i)] = x[0]

print(new_list) #[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 3, 1]

尝试将new_list初始化为0的列表,然后使用new_list使用新值查找将其放在.index(value)中的位置的索引,这不是最优化的做法事情,但它应该完成工作。

为什么要像这样存储它。在我看来,您可能希望将new_list的值映射回list1作为某种查找。如果是这种情况,您可能需要考虑使用字典来查找键值对,它会更快更好,这是Kevin's answer的第一行。

答案 3 :(得分:0)

@ mp252 ,我很欣赏这个问题的答案,我想要与Interactive Python Terminal上执行的简单代码示例分享一些建议。最后,我使用map()dictionary comprehension回答了问题,它类似于 Kevin 的答案。

  

http://rextester.com/VODUZ45704尝试在线解决问题。

»请勿使用spit(' '),请使用split()忽略额外的空格。

查看Python Interactive Terminal上执行的以下语句序列。

>>> s = 'Opportunities email 2018-7'
>>> s.split();
['Opportunities', 'email', '2018-7']
>>>
>>> s.split(' ');
['Opportunities', 'email', '2018-7']
>>>
>>> s = 'Opportunities           email    2018-7'
>>> s.split();
['Opportunities', 'email', '2018-7']
>>>
>>> s.split(' ');
['Opportunities', '', '', '', '', '', '', '', '', '', '', 'email', '', '', '', '2018-7']
>>>
>>> s = '  Opportunities           email    2018-7  '
>>> s.split();
['Opportunities', 'email', '2018-7']
>>>
>>> s.split(' ');
['', '', 'Opportunities', '', '', '', '', '', '', '', '', '', '', 'email', '', '', '', '2018-7', '', '']
>>>

现在,您可以尝试使用以下代码获取new_list

  
      
  • 字典很快,因为它的任何项目都可以在O(1)时间内搜索,并且它支持与数组不同的字符串索引,因此我们可以使用它来映射'2018-7' => 272018-2 => 5等。

  •   
  • 最后,我们可以通过查找其项目的存在作为字典内的键来迭代list。如果显示,则将相应的值添加到new_list,否则添加0。

  •   
list1 = ['2018-24', '2018-23', '2018-22', '2018-21', '2018-20', '2018-19', '2018-18', '2018-17', '2018-16', '2018-15', '2018-14', '2018-13', '2018-12', '2018-11']

list2 = [(27, 'Deutsche Bank', 'Opportunities email 2018-7'), (5, 'Deutsche Bank', 'Opportunities email 2018-2'), (4, 'Deutsche Bank', 'Opportunities email 2018-6'), (3, 'Deutsche Bank', 'Opportunities email 2018-10'), (3, 'Deutsche Bank', 'Opportunities email 2018-14'), (3, 'Deutsche Bank', 'Opportunities email 2017-50'), (3, 'Deutsche Bank', 'Opportunities email 2018-12'), (3, 'Deutsche Bank', 'Opportunities email 2018-4'), (2, 'Deutsche Bank', 'Opportunities email 2018-5'), (2, 'Deutsche Bank', 'Opportunities email 2018-3'), (2, 'Deutsche Bank', 'Opportunities email 2017-51'), (1, 'Deutsche Bank', 'Opportunities email 2018-13'), (1, 'Deutsche Bank', 'Opportunities email 2018-11')]

d = {tup[2].split()[2]:tup[0] for tup in list2};
new_list = list(map(lambda date: d[date] if date in d else 0, list1));

print(new_list);

»输出

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 3, 1]