2016-10-03 79 views
4

后比方说,我有这样一个Python列表:获取的蟒蛇列表项前面的索引值洗牌

l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

使用random.shuffle

>>> import random 
>>> random.shuffle(l) 
>>> l 
[5, 3, 2, 0, 8, 7, 9, 6, 4, 1] 

我有上面的列表中。

如何获取混洗列表中每个项目的先前索引值列表?

+3

使用字典跟踪每次拨打电话后每个号码的索引号码 – idjaw

+0

idjaw,你能举个例子吗? – yusuf

+1

你是否真的需要洗牌清单或索引? – MisterMiyagi

回答

13

你可以配对使用enumerate其索引的每个项目,然后混洗。这种方法的

>>> import random 
>>> l = [4, 8, 15, 16, 23, 42] 
>>> x = list(enumerate(l)) 
>>> random.shuffle(x) 
>>> indices, l = zip(*x) 
>>> l 
(4, 8, 15, 23, 42, 16) 
>>> indices 
(0, 1, 2, 4, 5, 3) 

一个优点是,它的作品无论是否l包含重复。在你的字典解析

使用enumerate进行索引和值在你的迭代,然后分配值为键,和指数值:

+0

感谢您:https://github.com/DaniSpringer/Projects/tree/master/stuff/python/guess-your-number-cards –

2

如果您的值是唯一的,只需使用list.index方法。例如,你可以这样做:

import random 
l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
start_l = l[:] 
random.shuffle(l) 
for elem in l: 
    print(elem, '->', start_l.index(elem)) 

当然,在你的例子,这是微不足道的 - 每个元素已经是它的初始索引。

# gives the same result as above. 
l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
random.shuffle(l) 
for elem in l: 
    print(elem, '->', elem) 

事实上,最好的方法很大程度上取决于你想要做什么。如果您有其他数据,则只需对指数进行洗牌可能是最简单的,而不是数据。这避免了重复等问题。基本上你会得到一个排列列表,其中每个元素都是位置转移到的索引。例如,[2, 1, 0]是用于反转列表的排列。

l = list(random.randint(0, 10) for _ in range(10)) 
l_idx = list(range(len(l))) # list of indices in l 
random.shuffle(l_idx) 
for new_idx, old_idx in enumerate(l_idx): 
    print(l[old_idx], '@', old_idx, '->', new_idx) 
1

要使用字典多事,一个能做到这一点。

import random 

l = [5, 3, 2, 0, 8, 7, 9, 6, 4, 1] 
d = {v: i for i, v in enumerate(l)} 
print(d) # current state 
random.shuffle(l) 

这里的好处是,你得到O(1)查找检索索引的任何值您正在寻找的。

但是,如果您的列表将包含重复,this来自凯文的答案应该被提及。

1

创建原始list的副本和随机副本:

>>> import random  
>>> l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> l_copy = list(l) # <-- Creating copy of the list 
>>> random.shuffle(l_copy) # <-- Shuffling the copy 
>>> l_copy # <-- Shuffled copy    
[8, 7, 1, 3, 6, 5, 9, 2, 0, 4] 
>>> l # <-- original list 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> 
1

一个更直观的替代其他答案:

洗牌索引范围,并用它来获取改组名单的原始值。