我有两个列表,其中一个列表是元组列表(将其称为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_list
和list1
的len是不同的,它们应该是相同的。但也可以看出new_list
的顺序与list1
值不匹配,因此例如new_list
的索引3处的值实际上应该在索引10处。我不确定为什么它似乎重新排序new_list
。
我期望获得的输出new_list
和list1
长度相同,但也有相应的值,例如ii in y
为真且{{1} }} ii
然后在考虑2018-14
和new_list
的索引10时,值分别应为list1
和3
,这是预期的另一个示例如果考虑2018-14
和new_list
的索引0,则输出分别应为list1
和0
。
下面列出了预期产出的完整细目;
2018-7
答案 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'
=>27
,2018-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]