【问题标题】:Python: how prevent duplication of randomly chosen key/value pairPython:如何防止重复随机选择的键/值对
【发布时间】:2020-09-04 04:48:32
【问题描述】:
def fill2_line1():
    x2 = random.choice(list(twoSyllValues.items()))
    line1.append(x2)

magicList = ([x[1] for x in line1])
            
if 1 in magicList:
    fill2_line1()
    fill2_line1()
    complete_line = line1[0][0] + " " + line1[1][0] + " " + 
    line1[2][0]
    print(complete_line)

这是有问题的部分 - 整个程序超过 150 行。它按原样完美运行,但有时我会得到重复的单词。为了优化代码,我想确保第一个随机元组选择中的键在该列表 line1 的下两个选定元组中不重复。我能想到的唯一方法是在第一个单词选择之后创建另一个字典,然后从新字典中排除该键值对,然后进行接下来的两个 random.choice 调用。我觉得一定有更简单的方法,但我还没有经验。

【问题讨论】:

  • 你能发布示例输入和预期输出吗
  • 当前输出可以是:wordA wordB wordA。我希望输出类似于: wordA word(anything but A) word(anything but A) 其中 wordA 是从字典中提取的元组中的第一个值。
  • @danno 在您的问题中包含此信息。使用适当的格式,我们会更容易理解而不是在 cmets 中。

标签: python list dictionary tuples


【解决方案1】:

我可以想出三种方法来解决您面临的问题。我将编写一个示例代码,您可以参考,因为我不知道您的整个代码。

  1. 在第二次 random.choice 调用之前删除密钥,并在需要时将其重新添加。这有点类似于创建另一个字典,但效率更高。
def fill2_line1():
    x2 = random.choice(list(twoSyllValues.items()))
    line1.append(x2)
    return x2

magicList = ([x[1] for x in line1])
            
if 1 in magicList:
    deleted_list = []
    # run first random.choice
    deleted_item = fill2_line1()
    deleted_list.append(deleted_item)
    del twoSyllValues[deleted_item[0]]
    # run second random.choice
    deleted_item = fill2_line1()
    deleted_list.append(deleted_item)
    del twoSyllValues[deleted_item[0]]
    complete_line = line1[0][0] + " " + line1[1][0] + " " 
                    + line1[2][0]
    print(complete_line)
    # add the deleted items back in after work is done
    for k, v in deleted_list:
        twoSyllValues[k] = v
  1. 运行 random.choice 直到没有重复项。
def fill2_line1(deleted_set):
    x2 = random.choice(list(twoSyllValues.items()))
    while x2 not in deleted_set:
        x2 = random.choice(list(twoSyllValues.items()))
    line1.append(x2)
    deleted_set.add(x2)

magicList = ([x[1] for x in line1])
            
if 1 in magicList:
    deleted_set = set([])
    fill2_line1(deleted_set)
    fill2_line1(deleted_set)
    complete_line = line1[0][0] + " " + line1[1][0] + " " 
                    + line1[2][0]
    print(complete_line)
  1. 为 random.choice 保留另一个列表
def fill2_line1(items_list):
    x2 = random.choice(items_list)
    line1.append(x2)
    items_list.remove(x2)

magicList = ([x[1] for x in line1])
            
if 1 in magicList:
    items_list = list(twoSyllValues.items())
    fill2_line1(items_list)
    fill2_line1(items_list)
    complete_line = line1[0][0] + " " + line1[1][0] + " " 
                    + line1[2][0]
    print(complete_line)

希望我的回答能给你一些想法!

【讨论】:

  • 是的!谢谢!我很高兴我明白了我的观点,而且你如此彻底地解决了它。明天我将尝试所有三种解决方案,看看它们是如何运行的。太棒了!
  • 很高兴听到这个消息!请告诉我进展如何!
  • 我得到了按预期运行的代码!但是,我最终只使用了您第一个想法的一部分。当我尝试使用这个:deleted_item = fill2_line1() 时,我不断收到此错误:TypeError: 'NoneType' object is not subscriptable。 fill2_line1 返回一个列表数据类型。 :( 第一个选择的单词真的不应该在程序的其余部分再次使用,所以我最终写了这个:random_select = random.choice(list(syll_values.items())) for key, value in dict(syll_values)。 items(): if key == random_select[0]: del syll_values[key] // 再次感谢逻辑思路!
  • 太好了,您找到了解决方案!如果有帮助,请点赞我的回答:) 我将不胜感激!
  • 它说我的评论已计入但不会显示,因为我的声誉或诸如此类的东西目前只有 10 条。需要 50 人才能公开投票。
猜你喜欢
  • 2011-07-02
  • 2017-12-25
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多