我在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(*)
用于解压缩列表。是否将“花朵”,“流量”和“飞行”作为单独的列表项。
答案 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 Python和Unpack 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: