我改变了你的格式,做到了你想要的。我用user键将所有子列表转换为dict。在
因为它更容易合并dict和子列表中user的顺序并不重要。在
最后一步是迭代合并的list1和{}的dict,并执行您的特殊操作。按照我的理解,是取list1的前一个数,并将其与list2合并。然后重新创建所需的子列表。在from itertools import chain
from collections import defaultdict
list1 = [['user1', 186, 'Feb 2017, Apr 2017', 550, 555], ['user2', 282, 'Mai 2017', 0, 3579], ['user3', 281, 'Mai 2017', 10, 60]]
list2 = [['user1', 186, 'Feb 2017, Mar 2017, Mai 2017', 0, 740],['user2', 282, 'Feb 2017', 0, 1000], ['user4', 288, 'Feb 2017', 60, 10]]
# Transform list to dict with key as 'userN'
def to_dict(lst): return {x[0]: x[1:] for x in lst}
# Now create a dict that combined list of user1..N+1
tmp_dict = defaultdict(list)
for k, v in chain(to_dict(list1).items(), to_dict(list2).items()):
tmp_dict[k].append(v)
desired_output = []
for k, v in tmp_dict.items():
if len(v) == 2:
v[1][-2] = v[0][-2] # Take the before last of list1 to remplace with before last one of list2
desired_output.append([k] + v[1])
else:
desired_output.append([k] + v[0])
print(desired_output)
输出:
^{pr2}$
编辑
看来我犯了一个错误,你的list1必须检查list2的所有内容,在这种情况下,你应该先做一个list2的{},然后再应用你的特定条件。例如:from itertools import chain
list1 = [['user1', 186, 'Feb 2017, Apr 2017', 550, 555], ['user2', 282, 'Mai 2017', 0, 3579], ['user3', 281, 'Mai 2017', 10, 60]]
list2 = [['user1', 186, 'Feb 2017, Mar 2017, Mai 2017', 0, 740],['user2', 282, 'Feb 2017', 0, 1000], ['user4', 288, 'Feb 2017', 60, 10]]
# Transform list to dict with key as 'userN'
def to_dict(lst): return {x[0]: x[1:] for x in lst}
# First, transfrom list2 to dict
list2_dict = {}
for k, v in to_dict(list2).items():
list2_dict[k] = v
# Then iterate on list1 to compare
desired_output = []
for k, v in to_dict(list1).items():
if k in list2_dict: # key of list1 exists in list2
list2_dict[k][-2] = v[-2] # replace value
desired_output.append([k] + list2_dict[k]) # Then add list2
list2_dict.pop(k) # And remove it from old dict
else: # list1 does not exists in list2
v[-1] = 0 # Set last element to zero
desired_output.append([k] + v)
for k, v in list2_dict.items(): # Now add elements present only in list2
desired_output.append([k] + v)
print(desired_output)
输出:[['user1', 186, 'Feb 2017, Mar 2017, Mai 2017', 550, 740], ['user2', 282, 'Feb 2017', 0, 1000], ['user3', 281, 'Mai 2017', 10, 0], ['user4', 288, 'Feb 2017', 60, 10]]
注意:我们可以去掉defaultdict,因为同一个密钥不会被添加两次。在