随机播放按行聚合的列表字典
Shuffle a dictionary of lists aggregating by rows
我有一个 defaultfict(list)
可能看起来像这样
d = {0: [2, 4, 5], 1: [5, 6, 1]}
我需要将所有列表中的所有第一个元素洗牌在一起,并将一个元素移到第二行和第三行。所以在这个例子中我需要将 [2, 5], [4, 6], [5, 1]
洗牌然后放回去。最后我的字典可能是这样的
d = {0: [5, 4, 1], 1: [2, 6, 5]}
是否有一种 pythonic 方法可以避免循环?
到目前为止,我所拥有的是一种提取和聚合列表中所有第一、第二等元素并使用此方法对它们进行洗牌的方法
[random.sample([tmp_list[tmp_index] for tmp_list in d.values()], 2) for tmp_index in range(3)]
这将创建以下内容
[[2, 5], [4, 6], [5, 1]]
然后为了创建最终的按行打乱的字典,我使用了简单的 for
循环。
- 获取字典值的转置版本:
>>> data = [list(v) for v in zip(*d.values())]
>>> data
[[2, 5], [4, 6], [5, 1]]
- 就地洗牌
>>> for x in data:
... random.shuffle(x)
...
>>> data
[[5, 2], [4, 6], [5, 1]]
- 再次转置数据
>>> data = zip(*data)
- 将新值赋给字典
>>> for x, k in zip(data, d):
... d[k][:] = x # Could also be written as d[k] = list(x)
...
>>> d
{0: [5, 4, 5], 1: [2, 6, 1]}
我有一个 defaultfict(list)
可能看起来像这样
d = {0: [2, 4, 5], 1: [5, 6, 1]}
我需要将所有列表中的所有第一个元素洗牌在一起,并将一个元素移到第二行和第三行。所以在这个例子中我需要将 [2, 5], [4, 6], [5, 1]
洗牌然后放回去。最后我的字典可能是这样的
d = {0: [5, 4, 1], 1: [2, 6, 5]}
是否有一种 pythonic 方法可以避免循环?
到目前为止,我所拥有的是一种提取和聚合列表中所有第一、第二等元素并使用此方法对它们进行洗牌的方法
[random.sample([tmp_list[tmp_index] for tmp_list in d.values()], 2) for tmp_index in range(3)]
这将创建以下内容
[[2, 5], [4, 6], [5, 1]]
然后为了创建最终的按行打乱的字典,我使用了简单的 for
循环。
- 获取字典值的转置版本:
>>> data = [list(v) for v in zip(*d.values())]
>>> data
[[2, 5], [4, 6], [5, 1]]
- 就地洗牌
>>> for x in data:
... random.shuffle(x)
...
>>> data
[[5, 2], [4, 6], [5, 1]]
- 再次转置数据
>>> data = zip(*data)
- 将新值赋给字典
>>> for x, k in zip(data, d):
... d[k][:] = x # Could also be written as d[k] = list(x)
...
>>> d
{0: [5, 4, 5], 1: [2, 6, 1]}