Python 等效于 Haskell 的 [1..](索引列表)

Posted

技术标签:

【中文标题】Python 等效于 Haskell 的 [1..](索引列表)【英文标题】:Python equivalent of Haskell's [1..] (to index a list) 【发布时间】:2015-10-21 00:39:13 【问题描述】:

我在 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 行代码并且感觉很多。

【问题讨论】:

顺便说一句:您可能想要:enumerate(s, start=1) 直接等效。此外,在itertools 模块中,有一个[n..] 完美等价物,即itertools.count(n),因此您可以将代码转换为zip(count(n), s) 对于你的n,当你不知道n的时候,你不会真的放len(s)吗? 没有。 count(n)[n..] “相同”,即大于或等于 n 的无限自然序列。 哦,所以在这种情况下,n 将是 0 或 1,具体取决于我想要索引的方式(根据给定的 Haskell 代码为 1) 【参考方案1】:

只需list(enumerate(s))。这会遍历 enumerate 对象并将其转换为 list

【讨论】:

我觉得这是迄今为止最干净的一个,即使它们都有效。它也适用于 Python 2.7【参考方案2】:

您可以使用列表推导来简化它:

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

【讨论】:

【参考方案3】:

使用enumerate 肯定是要走的路,但这里有一个更实用的解决方案toolz:

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

【讨论】:

【参考方案4】:

您可以将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')]

【讨论】:

注意:这只适用于 Python 2,其中zip() 返回list 因为(在 Python 3 中)zip(range(len(s)) , s 在功能上与enumerate(s) 相同,看起来您已经到达list(enumerate(s))。 :P

以上是关于Python 等效于 Haskell 的 [1..](索引列表)的主要内容,如果未能解决你的问题,请参考以下文章

PureScript 等价于 Haskell 的 >> 运算符

从 Haskell 翻译的 Python 中,Count 懒惰地运行

等效于 Javascript 中的 python 范围 [重复]

Javascript 等效于 Python 的 zip 函数

等效于 JavaScript 中 Python 的 sys.exit()

适用于 Mac 的 Python Winsound 等效项