我写了一个小程序来填充我的游戏,从名字和姓氏列表中随机选择命名的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名称,在几乎没有加载的时间与开放的道路,以扩大。我是惊人的高兴:)案件结案!
2条答案
按热度按时间rks48beu1#
首先,我们需要名字和姓氏的所有可能组合,我们可以使用
itertools.product
来得到:既然你想从这个列表中随机取名字,就把它打乱。
每次你想添加一个NPC时,
pop
从这个列表中移除最后一个元素。因为你之前移动了这个列表,所以即使你总是弹出最后一个元素,你也会得到一个随机的元素。弹出这个元素会把它从列表中移除。所以你不必担心重复。注意不要弹出超过列表所包含的(你已经在其他地方指出这不是一个问题)。我更喜欢从列表的 end 弹出,因为这是一个O(1)操作。从不同的位置弹出会更昂贵。gg0vcinb2#
最后,将字符串列表转换为集合,然后再转换回列表以删除任何重复项,然后使用len()函数确定列表的长度与所需长度的比较,并再次调用该函数,这一次添加到列表中。