python - 在 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']}
推荐阅读
- makefile - 为 c/c++ 编写通用 makefile:编译器抱怨“/bin/sh: 1: ./main.o: Exec format error”
- python - 检查浮点数是否在 Python 的字典键中
- python - Python:按数字拆分字符串
- excel - 没有有序数据的匹配函数
- java - 嗨,我正在尝试编写一个 java 程序,它列出了当用户输入空格分隔的名称时人们可以排队的所有可能方式
- javascript - Bootstrap 没有做它应该做的事情
- swift - 如何防止同一窗口的多个实例在 macOS 中打开?
- gitlab - 克隆同组项目,并在目标项目中使用源项目的 .gitlab-ci.yml 作为模板
- python - 如何从变量中提取时间并将其与python中的当前时间进行比较?
- laravel - Laravel 前端网站和 Laravel API 之间的通信,都在 Valet 下