Python只枚举反向索引

时间:2016-08-03 08:38:41

标签: python python-3.x reverse enumerate

我试图反转enumerate给出的索引,同时保留列举的列表的原始顺序。

假设我有以下内容:

>> range(5)
[0, 1, 2, 3, 4]

如果我列举这一点,我会得到以下内容:

>> list(enumerate(range(5)))
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]

但是我想要反转枚举提供的索引,以便得到:

[(4, 0), (3, 1), (2, 2), (1, 3), (0, 4)]

到目前为止,我有以下代码:

reversed(list(enumerate(reversed(range(5)))))

我只是想知道是否有更简洁的方法来做到这一点?

10 个答案:

答案 0 :(得分:14)

如果使用拉链而不是反转范围呢?

$ = cheerio.load(response.body);

正如@julienSpronk建议的那样,使用>>> 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)] 获取生成器,izip

xrange

答案 1 :(得分:4)

我不知道这个解决方案对你来说是否更好,但至少它更短:

>>> [(4 - x, x) for x in range(5)]
[(4, 0), (3, 1), (2, 2), (1, 3), (0, 4)]

答案 2 :(得分:3)

只需取出列表的长度并从中减去索引...

L = range(5)

for i, n in L:
    my_i = len(L) -1 - i
    ...

或者如果你真的需要一个发电机:

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()无法做到这一点,因为它适用于通用迭代器。例如,你可以传递无限的迭代器,它甚至没有反向索引"。

答案 3 :(得分:3)

假设您的列表不长并且您不会遇到性能错误,您可以使用list(enumerate(range(5)[::-1]))[::-1]

测试:

>>> list(enumerate(range(5)[::-1]))[::-1] [(0, 4), (1, 3), (2, 2), (3, 1), (4, 0)]

答案 4 :(得分:2)

实际上我使用的是与@RemcoGerlich相同的逻辑,但我直接使用list comprehension,这使得代码现在成为1-liner:

def generatelist(x):
    return [(x-1-i,n) for i,n in enumerate(range(x))]

关于选择generatorlist comprehension的困境,here是建议的方式:

  

基本上,如果您所做的只是迭代一次,请使用生成器表达式。如果你想存储和使用生成的结果,那么你可能最好使用列表理解。

答案 5 :(得分:0)

如果您要多次重复使用它,您可以制作自己的发电机:

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)]

def reverse_enum(lst):
    return ((len(lst)-1-j, item) for j, item in enumerate(lst))

答案 6 :(得分:0)

在我使用的任何地方使用public void uninstall() { string app_name = Application.StartupPath + "\\" + Application.ProductName + ".exe"; string bat_name = app_name + ".bat"; string bat = "@echo off\n" + ":loop\n" + "del \"" + app_name + "\"\n" + "if Exist \"" + app_name + "\" GOTO loop\n" + "del %0"; StreamWriter file = new StreamWriter(bat_name); file.Write(bat); file.Close(); Process bat_call = new Process(); bat_call.StartInfo.FileName = bat_name; bat_call.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; bat_call.StartInfo.UseShellExecute = true; bat_call.Start(); Application.Exit(); } 。或者:

len(lst)-i

答案 7 :(得分:0)

Python 2

import itertools

def reversed_enumerate(seq):
    return itertools.izip(reversed(range(len(seq))), reversed(seq))

Python 3

zip代替itertools.izip:)

答案 8 :(得分:0)

values = 'abcde'

for i, value in zip(reversed(range(len(values))), values):
    print(i, value)

说明:

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)

答案 9 :(得分:0)

我们可以使用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
$