Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据枚举数合并两个列表?_Python - Fatal编程技术网

Python 如何根据枚举数合并两个列表?

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”更改为元素从“列表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:

[(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')]