随机聚合列表

时间:2017-07-22 22:46:19

标签: python dictionary defaultdict

我有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循环。

1 个答案:

答案 0 :(得分:1)

  1. 获取dict值的转置版本:
  2. >>> data = [list(v) for v in zip(*d.values())]    
    >>> data
    [[2, 5], [4, 6], [5, 1]]
    
    1. 将他们原地洗牌
    2. >>> for x in data:
      ...     random.shuffle(x)
      ...
      
      >>> data
      [[5, 2], [4, 6], [5, 1]]
      
      1. 再次转置数据
      2. >>> data = zip(*data)
        
        1. 将新值分配给dict
        2. >>> 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]}