【问题标题】:Distribute items from a list into a new list将列表中的项目分配到新列表中
【发布时间】:2020-07-24 19:57:06
【问题描述】:

我有一些清单:

original = [1234, 2456, 1245, 5734, 1245, 74512, 13678, 1456, 3926, 1974]
list1 = []
list2 = []
list3 = []
list4 = []

我正在尝试将一定数量的数字从原始列表移到新列表中。 list1 应该有 4 个,list2 应该有 3 个,list3 应该有 2 个,list4 应该有 1 个。进入新列表的数字应该是随机选择的,而不是按任何特定顺序。两个列表中也不应该有任何相同的数字;所有列表都应该有唯一的编号。 我该如何解决这个问题?

【问题讨论】:

    标签: python list random


    【解决方案1】:

    这是一种方法,使用random.randrangelist.pop(你说你想从original“移动”项目,所以我假设你完成后它应该是空的——如果不是你可以这样做带副本):

    >>> import random
    >>> original = [1234, 2456, 1245, 5734, 1245, 74512, 13678, 1456, 3926, 1974]
    >>> list1 = []
    >>> list2 = []
    >>> list3 = []
    >>> list4 = []
    >>> for i, target in enumerate([list4, list3, list2, list1]):
    ...     for _ in range(i+1):
    ...         target.append(original.pop(random.randrange(len(original))))
    ...
    >>> [list1, list2, list3, list4]
    [[3926, 1234, 1456, 74512], [13678, 2456, 1245], [5734, 1245], [1974]]
    >>> original
    []
    

    请注意,只要您有一堆编号变量(如list1list2 等),通常将它们列成一个列表会更容易:

    >>> original = [1234, 2456, 1245, 5734, 1245, 74512, 13678, 1456, 3926, 1974]
    >>> sublists = [[] for _ in range(4)]
    >>> for i, s in enumerate(reversed(sublists)):
    ...     for _ in range(i+1):
    ...         s.append(original.pop(random.randrange(len(original))))
    ...
    >>> sublists
    [[1456, 1245, 5734, 1245], [13678, 74512, 2456], [1974, 3926], [1234]]
    

    一旦你把你的输出变成了一个列表,你可以把整个事情构建成一个理解:

    >>> original = [1234, 2456, 1245, 5734, 1245, 74512, 13678, 1456, 3926, 1974]
    >>> [[original.pop(random.randrange(len(original))) for _ in range(i)] for i in range(4, 0, -1)]
    [[1234, 74512, 1974, 1456], [13678, 1245, 3926], [2456, 1245], [5734]]
    

    另一种选择是只对列表进行一次随机播放,这样您就可以简单地弹出最后一个元素,而不是每次都选择一个随机元素:

    >>> original = [1234, 2456, 1245, 5734, 1245, 74512, 13678, 1456, 3926, 1974]
    >>> random.shuffle(original)
    >>> [[original.pop() for _ in range(i)] for i in range(4, 0, -1)]
    [[2456, 1245, 3926, 1974], [13678, 74512, 1234], [1245, 1456], [5734]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      • 2017-08-25
      • 2020-05-25
      相关资源
      最近更新 更多