列表理解可从元组列表中提取多个字段

时间:2018-10-30 20:31:32

标签: python tuples itertools

我有一个元组列表

servers = [('server1', 80 , 1, 2), ('server2', 443, 3, 4)]

我想创建一个只有前两个字段的新列表,如:

 [('server1', 80), ('server2', 443)]

但是我看不到如何对多个元素进行列表理解。

hosts = [x[0] for x in servers]  # this works to give me ['server1', server2']

hostswithports = [x[0], x[1] for x in servers] # this does not work

相对于使用循环,我更喜欢学习pythonic方式-我在做什么错了?

4 个答案:

答案 0 :(得分:36)

您可以使用extended iterable unpacking

>>> servers = [('server1', 80 , 1, 2), ('server2', 443, 3, 4)]
>>> [(server, port) for server, port, *_ in servers]
[('server1', 80), ('server2', 443)]

通常将_用作占位符。

答案 1 :(得分:15)

您所做的基本上是 对。您试图将列表中的每个元组转换为新的元组。但是您忘了实际声明元组。这就是括号的作用:

hosts = [(x[0], x[1]) for x in servers]

答案 2 :(得分:15)

使用基本切片,如果您的任何列表元素没有预期的子元素数量,这样做的好处就是不会失败。

[el[:2] for el in servers]

[('server1', 80), ('server2', 443)]

答案 3 :(得分:7)

您可以使用itemgetter

n !! (i+1)

输出

from operator import itemgetter


servers = [('server1', 80 , 1, 2), ('server2', 443, 3, 4)]

result = list(map(itemgetter(0, 1), servers))

print(result)

以下是更具可读性的替代方法:

[('server1', 80), ('server2', 443)]