Python 如何根据枚举数合并两个列表?
如何合并两个枚举列表,如果第一个数字相同,将元素从“列表1”更改为元素从“列表2” 清单1:Python 如何根据枚举数合并两个列表?,python,Python,如何合并两个枚举列表,如果第一个数字相同,将元素从“列表1”更改为元素从“列表2” 清单1: [(1, 'a’), (2, ['00:00:00,280', '00:00:09,680\n']), (3, 'b), (4, 'c'), (5, 'd’), (6, ['00:00:08,760', '00:00:13,309\n']), (7, 'e'), (8, 'f'), (9, 'g'), (10, ['00:00:09,680', '00:00:15,630\n'])] 清单2: [
[(1, 'a’), (2, ['00:00:00,280', '00:00:09,680\n']), (3, 'b), (4, 'c'), (5, 'd’),
(6, ['00:00:08,760', '00:00:13,309\n']), (7, 'e'), (8, 'f'), (9, 'g'),
(10, ['00:00:09,680', '00:00:15,630\n'])]
清单2:
[(2, ['00:00:00,280', '00:00:08,760']), (6, ['00:00:08,760', '00:00:09,680']),
(10, ['00:00:09,680', '00:00:13,309'])]
结果:
[(1, 'a’), (2, ['00:00:00,280', '00:00:08,760']), (3, 'b), (4, 'c'), (5, 'd’),
(6, ['00:00:08,760', '00:00:09,680']), (7, 'e'), (8, 'f'), (9, 'g'),
(10, ['00:00:09,680', '00:00:13,309'])]
尝试将关键字与sorted()一起使用
键应该是一个确定如何从数据结构中检索可比较元素的函数。在您的例子中,它是元组的第一个元素,因此我们访问[0]。将列表转换为dict 使用第二个dict更新第一个dict 将第一个列表转换回列表 排序列表
a = [(1, 'a'), (2, ['00:00:00,280', '00:00:09,680\n']), (3, 'b'), (4, 'c'), (5, 'd'), (6, ['00:00:08,760', '00:00:13,309\n']), (7, 'e'), (8, 'f'), (9, 'g'), (10, ['00:00:09,680', '00:00:15,630\n'])]
b = [(2, ['00:00:00,280', '00:00:08,760']), (6, ['00:00:08,760', '00:00:09,680']), (10, ['00:00:09,680', '00:00:13,309'])]
c = [(1, 'a'), (2, ['00:00:00,280', '00:00:08,760']), (3, 'b'), (4, 'c'), (5, 'd'), (6, ['00:00:08,760', '00:00:09,680']), (7, 'e'), (8, 'f'), (9, 'g'), (10, ['00:00:09,680', '00:00:13,309'])]
da = {k:v for k,v in a}
db = {k:v for k,v in b}
da.update(db)
x = sorted((k,v) for k,v in da.items())
print(x == c) # True
编辑:正如@jferard在评论中指出的,我可以写得更简单一些
da = dict(a)
db = dict(b)
da.update(db)
x = sorted(da.items())
print(x == c) # True
或
甚至
x = sorted(dict(a+b).items())
print(x == c) # True
我的解决方案与这里的其他答案略有不同,但我认为它获得了所需的功能,并且少了一次字典转换 我将第二个列表更改为dict,然后进行列表理解以创建一个新列表。我保留了元组中的第一个条目,并执行了
dict.get()
尝试从第二个列表中获取一个值:
dict_b = {i: j for i,j in b}
new_a = [(i, dict_b.get(i, j)) for i, j in a]
您也不必对列表重新排序。这将导致运行时间稍好一些:
def func_1():
dict_b = {i: j for i,j in b}
return [(i, dict_b.get(i, j)) for i, j in a]
%timeit func_1()
2.48 µs ± 506 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
def func_2():
da = {k:v for k,v in a}
db = {k:v for k,v in b}
da.update(db)
return sorted((k,v) for k,v in da.items())
%timeit func_2()
3.07 µs ± 71.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
另一个解决方案:
>>> a = [(1, 'a'), (2, ['00:00:00,280', '00:00:09,680\n']), (3, 'b'), (4, 'c'), (5, 'd'), (6, ['00:00:08,760', '00:00:13,309\n']), (7, 'e'), (8, 'f'), (9, 'g'), (10, ['00:00:09,680', '00:00:15,630\n'])]
>>> b = [(2, ['00:00:00,280', '00:00:08,760']), (6, ['00:00:08,760', '00:00:09,680']), (10, ['00:00:09,680', '00:00:13,309'])]
>>> seen = set()
>>> sorted(v for v in b+a if not (v[0] in seen or seen.add(v[0])))
[(1, 'a'), (2, ['00:00:00,280', '00:00:08,760']), (3, 'b'), (4, 'c'), (5, 'd'), (6, ['00:00:08,760', '00:00:09,680']), (7, 'e'), (8, 'f'), (9, 'g'), (10, ['00:00:09,680', '00:00:13,309'])]
<>代码>元素> < <代码> >元素> < < />代码>(<代码> >在B+A < /CODE >中),并使用该技巧获得鬼影顺序中的唯一元素:如果<代码> V [ 0 ]在可见< /代码>中,我们产生<代码> V< /代码>,否则我们添加<代码> v[ 0 ] < /代码> < <代码>参见<代码>(<代码>参见.Advd(0))。执行副作用,并且始终评估为False
)
如果您对结果顺序不感兴趣:
>>> seen = set()
>>> [v for v in b+a if not (v[0] in seen or seen.add(v[0]))]
[(2, ['00:00:00,280', '00:00:08,760']), (6, ['00:00:08,760', '00:00:09,680']), (10, ['00:00:09,680', '00:00:13,309']), (1, 'a'), (3, 'b'), (4, 'c'), (5, 'd'), (7, 'e'), (8, 'f'), (9, 'g')]
到目前为止,您尝试了什么?将列表转换为dicts;使用第二dict的第一dict更新;将第一个列表转换回列表;排序列表。您得到两个元素
(2,['00:00:00280','00:00:09680\n']),(2,['00:00:00280','00:00:08760'])
,但结果应该只有第二个值。是否有理由使用{k:v表示k,v表示a}
而不是dict(a)
?顺便说一句,d={k:v代表k,a+b中的v}
应该有用。@jferard这是一种习惯-我通常使用它来创建dict并一步更改值-就像{k:v.strip().split(,”)代表k,v在a}
:)现在我可以简单地使用dict(a)
和list(da.item()
)不能进行两次投票,但排序(dict(a+b).items())
就是答案。在Python>=3.6中,sorted
可能是不必要的。@jferard我也希望在>=3.6中,它应该在没有sorted()
的情况下工作,但我在3.7上进行了测试,需要sorted()
很好地了解它。我对插入顺序的dicts不是很有信心。
>>> a = [(1, 'a'), (2, ['00:00:00,280', '00:00:09,680\n']), (3, 'b'), (4, 'c'), (5, 'd'), (6, ['00:00:08,760', '00:00:13,309\n']), (7, 'e'), (8, 'f'), (9, 'g'), (10, ['00:00:09,680', '00:00:15,630\n'])]
>>> b = [(2, ['00:00:00,280', '00:00:08,760']), (6, ['00:00:08,760', '00:00:09,680']), (10, ['00:00:09,680', '00:00:13,309'])]
>>> seen = set()
>>> sorted(v for v in b+a if not (v[0] in seen or seen.add(v[0])))
[(1, 'a'), (2, ['00:00:00,280', '00:00:08,760']), (3, 'b'), (4, 'c'), (5, 'd'), (6, ['00:00:08,760', '00:00:09,680']), (7, 'e'), (8, 'f'), (9, 'g'), (10, ['00:00:09,680', '00:00:13,309'])]
>>> seen = set()
>>> [v for v in b+a if not (v[0] in seen or seen.add(v[0]))]
[(2, ['00:00:00,280', '00:00:08,760']), (6, ['00:00:08,760', '00:00:09,680']), (10, ['00:00:09,680', '00:00:13,309']), (1, 'a'), (3, 'b'), (4, 'c'), (5, 'd'), (7, 'e'), (8, 'f'), (9, 'g')]