我有一个元组列表
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方式-我在做什么错了?
答案 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)]