【问题标题】:How to randomly select a tuple from a list?如何从列表中随机选择一个元组?
【发布时间】:2017-04-26 03:28:34
【问题描述】:

我从两个元组中随机创建一个元组列表,如下所示:

tuple1 = ('green','yellow','blue','orange','indigo','violet')
tuple2 = ('tree',2,'horse',4,6,1,'banana')

mylist = [(t1,t2) for item1 in tuple1 for item2 in tuple2]

这当然给了我类似的东西:

[('green','tree'),('yellow', 2)] 等等。

然后,我想随机从生成的mylist 中选择一个包含两项的元组。换句话说,返回类似('green',2)

如何从它们的列表中随机选择一个包含两项的元组?我尝试了以下方法,但它不起作用:

my_single_tuple = random.choice(mylist.pop())

如有任何线索或建议,我将不胜感激。

[编辑] 我不清楚目标:我想从列表中删除(弹出)随机选择的元组。

【问题讨论】:

  • 上述代码执行结果:NameError: name 't1' is not defined
  • random.choice 需要一个列表,那么为什么不只是 my_single_tuple = random.choice(mylist)
  • 顺便说一句,mylist 可以用mylist = list(zip(tuple1, tuple2)) 构建
  • 然后随机选择一个有效的索引并.pop它。它是该索引处的元组这一事实无关紧要。
  • 获得元组的组合列表后,请参阅stackoverflow.com/questions/10048069/… 以弹出随机元素

标签: python list python-3.x random


【解决方案1】:

如果你想选择一个元组然后删除它,只需获取索引并在之后删除它。

import random

tuple1 = ('green','yellow','blue','orange','indigo','violet')
tuple2 = ('tree',2,'horse',4,6,1,'banana')

mylist = [(item1,item2) for item1 in tuple1 for item2 in tuple2]


while len(mylist) > 0:
    index = random.randint(0,len(mylist)-1)
    print(mylist[index])
    del mylist[index]

【讨论】:

  • 我说,“这就是为什么会有random.randrange。我不确定最后的更改对两者有什么帮助,list.pop 有什么问题吗?一些迹象表明 OP 想要完全清除列表并且只打印其中的元素?
  • 为什么不使用 random.shuffle once 然后从末尾弹出元素?
【解决方案2】:

如果您需要多次执行此操作,只需将列表打乱一次,然后从前面弹出项目:

random.shuffle(mylist)
mylist.pop()
mylist.pop()

等等

【讨论】:

  • 这仅在列表的原始顺序无用时才有效。
  • 是的,我在想他会从列表中随机弹出项目直到列表为空或满足某些条件的场景。
【解决方案3】:

我想我找到了一个可行的答案:

my_item = mylist.pop(random.randrange(len(mylist)))

这成功地从列表中给了我一个随机元组。谢谢@philipp-braun,您的答案非常接近,但对我不起作用。

【讨论】:

    猜你喜欢
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 2018-03-06
    • 1970-01-01
    • 2014-07-23
    相关资源
    最近更新 更多