Haskell [1..]的Python等价物(索引列表)

gg58donl  于 2023-03-19  发布在  Python
关注(0)|答案(5)|浏览(147)

我在python中有一个元素列表。我不知道列表中元素的数量。我想给列表添加索引。
在Haskell,我可以做以下事情

zip [1..] "abcdefghijklmnop"
[(1,'a'),(2,'b'),(3,'c'),(4,'d'),(5,'e'),(6,'f'),(7,'g'),(8,'h'),(9,'i'),(10,'j'),(11,'k'),(12,'l'),(13,'m'),(14,'n'),(15,'o'),(16,'p')]

现在假设字符串的大小未知,这在Haskell中仍然有效,整数列表给出所需数量的整数,直到字符串用完为止。
在Python中如何做同样的事情呢?
我已经试过了:

s = "abcdefghijklmnop"
indexedlist = []
for i,c in enumerate(s):
    indexedlist.append((i,c))

>>> indexedlist
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f'), (6, 'g'), (7, 'h'), (8, 'i'), (9, 'j'), (10, 'k'), (11, 'l'), (12, 'm'), (13, 'n'), (14, 'o'), (15, 'p')]

它的工作,但我想知道是否有一个更短/更干净的方式,因为它是4行代码,感觉很多。

gcmastyq

gcmastyq1#

只需要执行list(enumerate(s)),它会迭代enumerate对象并将其转换为list

jqjz2hbq

jqjz2hbq2#

你可以用一个列表解析来简化它:

>>> [i for i in enumerate(s)]
92dk7w1h

92dk7w1h3#

可以将range函数与zip配合使用。
对于Python 2:

>>> s = "abcdefghijklmnop"
>>> zip(range(16),s)
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f'), (6, 'g'), (7, 'h'), (8, 'i'), (9, 'j'), (10, 'k'), (11, 'l'), (12, 'm'), (13, 'n'), (14, 'o'), (15, 'p')]

对于Python 3:

>>> s = "abcdefghijklmnop"
>>> list(zip(range(16),s))
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f'), (6, 'g'), (7, 'h'), (8, 'i'), (9, 'j'), (10, 'k'), (11, 'l'), (12, 'm'), (13, 'n'), (14, 'o'), (15, 'p')]
igetnqfo

igetnqfo4#

使用enumerate无疑是可行之道,但这里有一个功能更强大的toolz解决方案:

from toolz.itertoolz import iterate, zip
zip(iterate(lambda x: x + 1, 0), "abcdefghijklmnop")
nnsrf1az

nnsrf1az5#

Haskell中的列表是懒惰的,实际上,它们也可以用于“无限列表”。
因此,语义上更等价的Python片段应该是:

enumerate(l, start=1)

如果您随后在这个结果上进行枚举,它将在列表l上进行枚举,并在必要时产生2元组。

相关问题