【问题标题】:Randomizing a list of tuples without random.shuffle() python在没有 random.shuffle() python 的情况下随机化一个元组列表
【发布时间】:2015-12-22 18:05:14
【问题描述】:

我有一个元组列表,看起来像... deck=[(1,'clubs'),(1,'hearts')...等等(13,'diamonds')

如何将此列表随机化为...

[(5,'spades'),(12,'clubs'),(3,'clubs'),... 等等?

我尝试过使用random.randint(),但似乎没有任何效果。而且我不能使用 random.shuffle()

【问题讨论】:

  • 你可以使用random模块中的任何东西吗?

标签: python list random tuples


【解决方案1】:

你想要random.shuffle():

>>> import random
>>> l = [1, 2, 3, 4, 5]
>>> random.shuffle(l)
>>> l
[2, 1, 5, 3, 4]

既然您似乎不能使用random.shuffle,也许您的老师希望您使用random.randint() 来获得1-13 之间的随机数,然后是随机花色(红心、梅花、方块、黑桃),然后形成一个这样的列表。请记住,您需要检查该卡是否已存在于列表中。

先尝试一下,但如果你做不到,那么这里就是解决方案。 我强烈建议您首先使用我上面提到的方法。

l = []
while len(l) < 52:
    number = random.randint(1, 13)
    suit = random.choice(['hearts', 'clubs', 'diamonds', 'spades'])
    card = (number, suit)
    if card not in l:
        l.append(card)

【讨论】:

  • 我不允许使用random.shuffle()还有别的方法吗?
  • @DrakeRobison 为什么不允许你使用random.shuffle
  • 哦,我想我知道你的老师想要什么方法。让我想办法
  • @DrakeRobison 抱歉花了这么长时间。我试图格式化我的答案,以便有一个剧透标签,这样你就可以试一试了。我强烈建议您先了解我在答案中包含的解释
  • @TerryA:我对这个答案投了反对票,因为它没有回答 OP 提出的实际问题,即如何在不使用 random.shuffle() 的情况下洗牌 pre-existing 列表.但是,因为 OP 现在说这是想要的,所以我撤回了反对票。
【解决方案2】:

如果您想对预先存在的列表进行洗牌,而不是创建已经洗牌的列表,那么做与random.shuffle 可能所做的非常相似的工作并不难(我故意避免检查源代码以避免有罪的知识这里):

deck = [(1,'clubs'),(1,'hearts')...]
for i, card in enumerate(deck):
    swapi = random.randrange(i, len(deck))
    deck[i], deck[swapi] = deck[swapi], card

所做的只是将牌组中的每张牌与牌组中或之后的牌交换,通过对每张牌这样做,最终结果不会保持原始牌组的顺序。

【讨论】:

  • 一位更有经验的同事告诉我要避免这种方法。显然,使用 Numpy 来实现这一点要好得多。见:blog.codinghorror.com/the-danger-of-naivete
  • @LaurieBamber:这不是链接中提到的幼稚解决方案。该解决方案将每个位置与每个其他可能的位置交换一次(即,它将索引 0 与从 0 到 n 的随机索引交换,然后将索引 1 与从 0 到 n 的随机索引交换,等等)。我的解决方案,通过使用random.randrange(i, len(deck)) (not randrange(len(deck))),最终得到与链接中的 Knuth-Fisher-Yates shuffle 相同的组合属性,将 0 与 0-n 交换,然后是 1使用 1-n 等,本质上是从剩余的未选择值集中选择一个值来占据每个槽。
  • 至于numpy,OP明确禁止使用random.shuffle;我怀疑使用 numpy 等效项是否可以接受。
  • 很公平,我不知道对此发表评论,我的同事只是说他认为这种方法可能会产生与所提供文章中列出的相同的问题。是 numpy 库的随机部分吗?我虽然随机是分开的。
  • @LaurieBamber:您提出numpy 是实现这一目标的更好方法,这是我提到它的唯一原因;不,randomnumpy.random 不一样,但它们都是为您工作的预定义 API,并且 OP 试图在不使用预定义 API 的情况下实现(因为老师禁止这样做)。如果他们在 Python 课上这么早,跳到 numpy(第三方,比 Python 内置程序更神奇)不会教他们正确的方法。
【解决方案3】:
   import time
   test_list = [r for r in range(20)]
   print("The original list is : " + str(test_list))
   for i in range(len(test_list)):
    n=str(time.time())[-1]
    j=int(n)

    # Swap arr[i] with the element at random index
    if j < len(test_list):
     test_list[i], test_list[j] = test_list[j], test_list[i]

   print("The shuffled list is : " + str(test_list))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多