后比方说,我有这样一个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]
我有上面的列表中。
如何获取混洗列表中每个项目的先前索引值列表?
后比方说,我有这样一个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]
我有上面的列表中。
如何获取混洗列表中每个项目的先前索引值列表?
你可以配对使用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
进行索引和值在你的迭代,然后分配值为键,和指数值:
感谢您:https://github.com/DaniSpringer/Projects/tree/master/stuff/python/guess-your-number-cards –
如果您的值是唯一的,只需使用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)
要使用字典多事,一个能做到这一点。
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来自凯文的答案应该被提及。
创建原始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]
>>>
一个更直观的替代其他答案:
洗牌索引范围,并用它来获取改组名单的原始值。
使用字典跟踪每次拨打电话后每个号码的索引号码 – idjaw
idjaw,你能举个例子吗? – yusuf
你是否真的需要洗牌清单或索引? – MisterMiyagi