[英]Python enumerate reverse index only
I am trying to reverse the index given by enumerate
whilst retaining the original order of the list being enumerated. 我试图反转
enumerate
给出的索引,同时保留enumerate
的列表的原始顺序。
Assume I have the following: 假设我有以下内容:
>> range(5)
[0, 1, 2, 3, 4]
If I enumerate this I would get the following: 如果我列举这个,我会得到以下内容:
>> list(enumerate(range(5)))
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]
However I want to reverse the index provided by enumerate so that I get: 但是我想要反转枚举提供的索引,以便得到:
[(4, 0), (3, 1), (2, 2), (1, 3), (0, 4)]
So far I have the following code: 到目前为止,我有以下代码:
reversed(list(enumerate(reversed(range(5)))))
I was just wondering if there was a neater way to do this? 我只是想知道是否有更简洁的方法来做到这一点?
How about using zip instead with a reversed range? 如何使用拉链而不是反转范围?
>>> zip(range(9, -1, -1), range(10))
[(9, 0), (8, 1), (7, 2), (6, 3), (5, 4), (4, 5), (3, 6), (2, 7), (1, 8), (0, 9)]
>>> def reversedEnumerate(l):
return zip(range(len(l)-1, -1, -1), l)
>>> reversedEnumerate(range(10))
[(9, 0), (8, 1), (7, 2), (6, 3), (5, 4), (4, 5), (3, 6), (2, 7), (1, 8), (0, 9)]
As @julienSpronk suggests, use izip
to get a generator, also xrange
: 正如@julienSpronk建议的那样,使用
izip
获取生成器,也使用xrange
:
import itertools
>>> import itertools
>>> def reversedEnumerate(l):
... return itertools.izip(xrange(len(l)-1, -1, -1), l)
...
>>> reversedEnumerate(range(10))
<itertools.izip object at 0x03749760>
>>> for i in reversedEnumerate(range(10)):
... print i
...
(9, 0)
(8, 1)
(7, 2)
(6, 3)
(5, 4)
(4, 5)
(3, 6)
(2, 7)
(1, 8)
(0, 9)
I don't know if this solution is better for you, but at least it's shorter: 我不知道这个解决方案对你来说是否更好,但至少它更短:
>>> [(4 - x, x) for x in range(5)]
[(4, 0), (3, 1), (2, 2), (1, 3), (0, 4)]
Just take the length of your list and subtract the index from that... 只需取出列表的长度并从中减去索引...
L = range(5)
for i, n in L:
my_i = len(L) -1 - i
...
Or if you really need a generator: 或者如果你真的需要一台发电机:
def reverse_enumerate(L):
# Only works on things that have a len()
l = len(L)
for i, n in enumerate(L):
yield l-i-1, n
enumerate()
can't possibly do this, as it works with generic iterators. enumerate()
不可能这样做,因为它适用于泛型迭代器。 For instance, you can pass it infinite iterators, that don't even have a "reverse index". 例如,你可以传递无限迭代器,它甚至没有“反向索引”。
Assuming your list is not long and you will not run into performance errors, you may use list(enumerate(range(5)[::-1]))[::-1]
. 假设您的列表不长并且您不会遇到性能错误,您可以使用
list(enumerate(range(5)[::-1]))[::-1]
。
Test: 测试:
>>> list(enumerate(range(5)[::-1]))[::-1] [(0, 4), (1, 3), (2, 2), (3, 1), (4, 0)]
Actually I'm using the same logic as @RemcoGerlich did, but I use list comprehension
directly, which make the code now become 1-liner: 实际上我使用的是与@RemcoGerlich相同的逻辑,但我直接使用
list comprehension
,这使代码现在成为1-liner:
def generatelist(x):
return [(x-1-i,n) for i,n in enumerate(range(x))]
Regarding the dilemma of choosing generator
or list comprehension
, here is the suggested way: 关于选择
generator
或list comprehension
的困境, 这里有建议的方法:
Basically, use a generator expression if all you're doing is iterating once.
基本上,如果您所做的只是迭代一次,请使用生成器表达式。 If you want to store and use the generated results, then you're probably better off with a list comprehension.
如果你想存储和使用生成的结果,那么你最好使用列表理解。
If you're going to re-use it several times, you can make your own generator: 如果您要重复使用它几次,您可以制作自己的发电机:
def reverse_enum(lst):
for j, item in enumerate(lst):
yield len(lst)-1-j, item
print list(reverse_enum(range(5)))
# [(4, 0), (3, 1), (2, 2), (1, 3), (0, 4)]
or 要么
def reverse_enum(lst):
return ((len(lst)-1-j, item) for j, item in enumerate(lst))
Simply use len(lst)-i
everywhere i is used. 只需使用
len(lst)-i
使用。 or: 要么:
[(len(range(5)) - x, x) for x in range(5)]
import itertools
def reversed_enumerate(seq):
return itertools.izip(reversed(range(len(seq))), reversed(seq))
Substitute zip
for itertools.izip
:) itertools.izip
替代zip
:)
values = 'abcde'
for i, value in zip(reversed(range(len(values))), values):
print(i, value)
Explanation: 说明:
values = 'abcde'
values_len = len(values) # 5
indexes = range(values_len) # [0, 1, 2, 3, 4]
reversed_indexes = reversed(indexes) # [4, 3, 2, 1, 0]
# combine reversed indexes and values
reversed_enumerator = zip(reversed_indexes, values)
for i, value in reversed_enumerator:
print(i, value)
We can use enumerate with len: 我们可以使用len枚举:
$ cat enumerate.py
arr = ['stone', 'cold', 'steve', 'austin']
for i, val in enumerate(arr):
print ("enu {} val {}".format(i, val))
for i, val in enumerate(arr):
print ("enu {} val {}".format(len(arr) - i - 1, val))
$ python enumerate.py
enu 0 val stone
enu 1 val cold
enu 2 val steve
enu 3 val austin
enu 3 val stone
enu 2 val cold
enu 1 val steve
enu 0 val austin
$
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.