python中的zip(*)功能

时间:2019-05-03 22:59:28

标签: python python-3.x python-2.7

我在Python中有此代码,我必须在下面的列表中打印非重复字母。输出应该为'fl',因为'fl'在所有三个字符串中都是通用的:

x=["flower","flow","flight"]

print([i for i in zip(*x)])

它显示以下输出:

[('f', 'f', 'f'), ('l', 'l', 'l'), ('o', 'o', 'i'), ('w', 'w', 'g')]

它如何工作?我知道zip(*)用于解压缩列表。是否将“花朵”,“流量”和“飞行”作为单独的列表项。

2 个答案:

答案 0 :(得分:1)

zip适用于任何类型的可迭代类型。尽管它最常与列表一起使用,但任何可迭代的方法都可以使用。字符串是可迭代的,每次迭代都会返回字符串中的下一个字符。

因此,对像"flower"这样的字符串进行迭代与对列表["f", "l", "o", "w", "e", "r"]进行迭代相同。因此,当您压缩多个字符串时,它将对相应的字符进行分组,就像在类似列表上进行压缩一样。

编写zip(*x)使用了参数解包。 x的每个元素成为zip的单独参数。因此,它等同于编写:

zip(x[0], x[1], x[2])

等效于:

zip("flower", "flow", "flight")

最终结果只有4个元素,因为zip到达最短输入(在这种情况下为"flow")的结尾时停止。

答案 1 :(得分:0)

Barmars answer解释了zip*的工作方式之后(有关更多信息,请参见fe Zip lists in PythonUnpack a list in Python?),您仍然缺少部分答案:

如何打印输入的“常用”字母

x = ["flower","flow","flight"]
zipped = zip(*x)

for a,b,c in zipped:
    if a == b == c:
        print(a, end = "")
    # do nothing if the 3 elements are not equal

输出:

fl

您还可以在连接内部使用理解来获取以下输出:

# take k[0] if all elements of k are equal, apply for all k in zipped
print( ''.join(k[0] for k in zipped if k[0]==k[1]==k[2]))

Doku: