Python 洗牌按行聚合的列表字典

Python 洗牌按行聚合的列表字典,python,dictionary,defaultdict,Python,Dictionary,Defaultdict,我有一个defaultfict(list)可能是这样的 d={0:[2,4,5],1:[5,6,1]} 我需要将所有列表中的所有第一个元素混合在一起,并将其中一个移动到第二行和第三行。所以在这个例子中,我需要将它们洗牌,然后放回原处。最后我的字典可能是这样的 d={0:[5,4,1],1:[2,6,5]} 有没有一种类似蟒蛇的方法来避免循环 到目前为止,我所拥有的是一种提取和聚合列表中所有第一、第二等元素的方法,并使用此 [random.sample([tmp_list[tmp_index]用于

我有一个
defaultfict(list)
可能是这样的

d={0:[2,4,5],1:[5,6,1]}

我需要将所有列表中的所有第一个元素混合在一起,并将其中一个移动到第二行和第三行。所以在这个例子中,我需要将它们洗牌,然后放回原处。最后我的字典可能是这样的

d={0:[5,4,1],1:[2,6,5]}

有没有一种类似蟒蛇的方法来避免循环

到目前为止,我所拥有的是一种提取和聚合列表中所有第一、第二等元素的方法,并使用此

[random.sample([tmp_list[tmp_index]用于tmp_list in d.values()],2)用于tmp_index in range(3)]

这将创建以下内容

[[2,5],[4,6],[5,1]

然后为了创建最终的按行洗牌字典,我使用simple
for
循环

  • 获取dict值的转置版本:
  • 把它们洗到位
  • 再次转换数据
  • 将新值分配给dict
  • >>> 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]}