【问题标题】:How can two items be randomly selected and moved from one list to another list?如何随机选择两个项目并将其从一个列表移动到另一个列表?
【发布时间】:2021-08-25 12:55:56
【问题描述】:

我想要一种方法从一个列表中选择两个元素(作为子列表),然后将它们移动到另一个列表,同时从第一个列表中删除它们。

我的代码:

A=[[17, 4, 10, 18, 11], [23, 16, 24, 29, 19, 12, 22], [15, 2, 32, 30, 20, 7, 25], [33, 21, 5, 13, 6, 28, 26, 31], [27, 8, 9, 14, 3]]
B = random.sample(A, 2)
      print("B",B)

我的结果:

B [[27, 8, 9, 14, 3], [33, 21, 5, 13, 6, 28, 26, 31]]

预期结果:

A [[17, 4, 10, 18, 11], [23, 16, 24, 29, 19, 12, 22], [15, 2, 32, 30, 20, 7, 25]]
B [[27, 8, 9, 14, 3], [33, 21, 5, 13, 6, 28, 26, 31]]

【问题讨论】:

  • 我检查了链接,程序员认为随机选择和向下回答并不完美,非常感谢您抽出宝贵的时间。
  • 您已经知道如何进行随机选择,所以缺少的是如何将项目从一个列表移动到另一个列表。

标签: python random sublist


【解决方案1】:

您可以从Apop/append 从一个列表到另一个列表中随机选择一个索引

import random

A = [[17, 4, 10, 18, 11], [23, 16, 24, 29, 19, 12, 22], [15, 2, 32, 30, 20, 7, 25], [33, 21, 5, 13, 6, 28, 26, 31], [27, 8, 9, 14, 3]]
B = []

for _ in range(2):
    B.append(A.pop(random.randrange(0, len(A))))

结果

>>> A
[[15, 2, 32, 30, 20, 7, 25], [33, 21, 5, 13, 6, 28, 26, 31], [27, 8, 9, 14, 3]]
>>> B
[[23, 16, 24, 29, 19, 12, 22], [17, 4, 10, 18, 11]]

请注意,当您调用 randrange 时,您需要在循环中重新评估 len(A),因为随着您使用 pop 元素,大小会减小。

【讨论】:

  • (还有“randrange”与randint几乎相同,但不包括最右边的限制值:不需要讨厌的“-1”。
  • @jsbueno 好电话,编辑了我的答案以包括,谢谢
  • 我会看到 randrange 功能,谢谢先生的努力。
【解决方案2】:

一个不太高效的解决方案:

import random

A = [
    [17, 4, 10, 18, 11],
    [23, 16, 24, 29, 19, 12, 22],
    [15, 2, 32, 30, 20, 7, 25],
    [33, 21, 5, 13, 6, 28, 26, 31],
    [27, 8, 9, 14, 3],
]

B = []
for i in random.sample(range(len(A)), 2):
    B.append(A[i])
    A.remove(A[i])

A, B
>>>
([[17, 4, 10, 18, 11],
  [23, 16, 24, 29, 19, 12, 22],
  [33, 21, 5, 13, 6, 28, 26, 31]],
 [[15, 2, 32, 30, 20, 7, 25], [27, 8, 9, 14, 3]])

一个更有效的:

idx = sorted(random.sample(range(len(A)), 2))
A_new = []
B = []
for i, a in enumerate(A):
    if i in idx:
        B.append(a)
        idx = idx[1:]
    else:
        A.append(a)

A = A_new

【讨论】:

    【解决方案3】:

    一种非常简单的方法是迭代 B 中的元素并在采样后从 A 中删除它们。

    for el in B:
        A.remove(el)
    
    >>> A
    [[15, 2, 32, 30, 20, 7, 25], [33, 21, 5, 13, 6, 28, 26, 31], [27, 8, 9, 14, 3]]
    >>> B
    [[23, 16, 24, 29, 19, 12, 22], [17, 4, 10, 18, 11]]
    

    【讨论】:

    • 但这不是随机的
    • @PCM 假设B 已经包含问题中随机选择的项目。
    • 是的。 B 的采样已经完成。
    【解决方案4】:

    一种可能的解决方案

    import random 
    A=[[17, 4, 10, 18, 11], [23, 16, 24, 29, 19, 12, 22], [15, 2, 32, 30, 20, 7, 25], [33, 21, 5, 13, 6, 28, 26, 31], [27, 8, 9, 14, 3]]
    B_with_index = random.sample((list(enumerate(A))), 2)
    
    B = []
    for element in B_with_index:
        
        B.append(element[1])
        A.pop(element[0])
        
    

    【讨论】:

      猜你喜欢
      • 2013-01-23
      • 1970-01-01
      • 1970-01-01
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多