python 如何防止随机选择中的重复?

vnzz0bqm  于 2022-12-21  发布在  Python
关注(0)|答案(2)|浏览(227)

我写了一个小程序来填充我的游戏,从名字和姓氏列表中随机选择命名的NPC。它工作,但有时有重复的名字选择。我如何防止重复?
我可以使用dict,但我更喜欢list。这是一个很大的缺点吗?adding_male_NPC中的注解块是我解决这个问题的尝试。

import random

women_names = ["Jennifer", "Jenna", "Judith", "Becky", "Kelly"]
man_names = ["Adam", "John", "Jack", "Jim", ]
surnames =["Salzinger", "Jefferson", "Blunt", "Jigsaw", "Elem"]
marriage_status = ["Single", "In couple", "Engaged", "Married", "Divorced", "Widow"]
male_NPCs = []
list = []

def clr_list(list):
    del list

def randomizer(list):
    random_choice = random.choice(list)
    clr_list(list)
    return random_choice

def random_male():
    male_surname = randomizer(surnames)
    male_name = randomizer(man_names)
    male_NPC = male_name + " " + male_surname
    return (male_NPC)

def add_one_man():
    male_NPCs.append(random_male())
    return

def addding_male_NPC(count_of_NPC_males):
    while count_of_NPC_males > 1:
        add_one_man()
        # for m in male_NPCs:
        #     unique_count = male_NPCs.count(m)
        #     if unique_count > 1:
        #         male_NPCs.pop(unique)
        #         count_of_NPC_males +=1
        #     else:
        count_of_NPC_males -= 1

count_of_NPC_males = int(input("How many males should create?: "))
addding_male_NPC(count_of_NPC_males)

print(male_NPCs)
print(len(male_NPCs))

所以我尝试了这个,但它不可能计数字符串或不知何故不使用好。计数什么是最有可能的。得到的想法采取索引之前,创建字符串的总和,并使用它来检查双,但我觉得我做了圆圈。我明白,提供的姓名和姓氏的列表并不保证与高数字双,但你得到了这一点。

def addding_male_NPC(count_of_NPC_males):
    while count_of_NPC_males > 1:
        add_one_man()
         for m in male_NPCs:
             unique_count = male_NPCs.count(m)
             if unique_count > 1:
                 male_NPCs.pop(unique)
                 count_of_NPC_males +=1
             else:
                  count_of_NPC_males -= 1

编辑这太可悲了:(

mylist = ["a", "b", "a", "c", "c"]
mylist = list(dict.fromkeys(mylist))
print(mylist)

但无论如何,它将削减计划和需要的项目数量。所以问题仍然是活跃的。这个答案是相当一半的答案。我等待更好的一个。

是的!我终于找到了答案!感谢〉〉Parnav〈〈(他就是那个家伙!)从他的建议我使代码生成从文本文件比我想象的更多

import random
import itertools

with open('stock_male_names.txt', 'r') as mn, open('stock_female_names.txt', 'r') as wn,  open('stock_surnames.txt', 'r') as sn:
    broken_male_names, broken_female_names, broken_surnames = mn.readlines(), wn.readlines(), sn.readlines()

male_names = [name.strip() for name in broken_male_names]
female_names = [name.strip() for name in broken_female_names]
surnames = [name.strip() for name in broken_surnames]

male_persons = [f"{fname} {lname}" for fname, lname in itertools.product(male_names, surnames)]
female_persons = [f"{fname} {lname}" for fname, lname in itertools.product(female_names, surnames)]

print(male_names)
print(len(male_names)) #1001
print(female_names)
print(len(female_names)) #1000
print(surnames)
print(len(surnames)) #1003
print(male_persons)
print(len(male_persons)) #1004003
print(female_persons)
print(len(female_persons)) #1003000

所以从三个文本文件的1 k项目,我做了1 kk独特的NPC名称,在几乎没有加载的时间与开放的道路,以扩大。我是惊人的高兴:)案件结案!

rks48beu

rks48beu1#

首先,我们需要名字和姓氏的所有可能组合,我们可以使用itertools.product来得到:

import itertools
import random

male_names = [f"{fname} {lname}" for fname, lname in itertools.product(man_names, surname)]

print(male_names)
# ['Adam Salzinger', 'Adam Jefferson', ..., 'John Salzinger', 'John Jefferson', ..., 'Jim Jigsaw', 'Jim Elem']

既然你想从这个列表中随机取名字,就把它打乱。

random.shuffle(male_names)
print(male_names)
# ['Jim Jefferson', 'Jack Jigsaw', 'Adam Jefferson', ..., 'Adam Blunt', 'John Blunt']

每次你想添加一个NPC时,pop从这个列表中移除最后一个元素。因为你之前移动了这个列表,所以即使你总是弹出最后一个元素,你也会得到一个随机的元素。弹出这个元素会把它从列表中移除。所以你不必担心重复。注意不要弹出超过列表所包含的(你已经在其他地方指出这不是一个问题)。我更喜欢从列表的 end 弹出,因为这是一个O(1)操作。从不同的位置弹出会更昂贵。

def add_male_npcs(count=1):
    for _ in range(count):
        male_NPCs.append(male_names.pop())
gg0vcinb

gg0vcinb2#

最后,将字符串列表转换为集合,然后再转换回列表以删除任何重复项,然后使用len()函数确定列表的长度与所需长度的比较,并再次调用该函数,这一次添加到列表中。

相关问题