在 Python 中随机播放集合字典



我正在尝试洗牌集合的字典。 这是我想随机洗牌的集合

{'1': ['IMG_0001.png', 'IMG_0002.png', 'IMG_0003.png', 'IMG_0004.png'], 
'2': ['IMG_0020.png', 'IMG_0021.png', 'IMG_0022.png', 'IMG_0023.png'], 
'3': ['IMG_0051.png', 'IMG_0052.png', 'IMG_0053.png', 'IMG_0054.png']} 

输出应该有点像下面这样

{'1': ['IMG_0001.png', 'IMG_0002.png', 'IMG_0053.png', 'IMG_0054.png'], 
'2': ['IMG_0020.png', 'IMG_0021.png', 'IMG_0022.png', 'IMG_0023.png'], 
'3': ['IMG_0003.png', 'IMG_0004.png', 'IMG_0051.png', 'IMG_0052.png']}

尝试在python中使用random.shuffle((,但没有按预期进行。谁能帮我。我是python的新初学者。谢谢你的帮助。

如果每个列表的大小应该相同,并且您希望将列表的所有元素相互打乱,则可以使用以下函数:

import random
import itertools

def shuffle(original: dict) -> dict:
all_elements = list(itertools.chain.from_iterable(original.values()))
m = len(all_elements) // len(original)  # list size
random.shuffle(all_elements)
return {k: all_elements[i*m : (i+1)*m] for i, k in enumerate(original)}

或者,使用more-itertools包:

import random
import itertools
import more_itertools

def shuffle(original: dict) -> dict:
all_elements = list(itertools.chain.from_iterable(original.values()))
list_length = len(all_elements) // len(original)
random.shuffle(all_elements)
return {k: l for k, l in more_itertools.sliced(all_elements, n=list_length)}

示例用法:

d = {
"1": ["IMG_0001.png", "IMG_0002.png", "IMG_0003.png", "IMG_0004.png"],
"2": ["IMG_0020.png", "IMG_0021.png", "IMG_0022.png", "IMG_0023.png"],
"3": ["IMG_0051.png", "IMG_0052.png", "IMG_0053.png", "IMG_0054.png"],
}
print(shuffle(d))
{'1': ['IMG_0023.png', 'IMG_0003.png', 'IMG_0021.png', 'IMG_0001.png'],
'2': ['IMG_0053.png', 'IMG_0051.png', 'IMG_0052.png', 'IMG_0004.png'],
'3': ['IMG_0054.png', 'IMG_0022.png', 'IMG_0002.png', 'IMG_0020.png']}

最新更新