(Python)创建一个具有唯一的自动生成的nam的列表

2024-04-28 13:17:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试通过随机生成家庭来自动填充城镇。我生成城镇的名称,生成住户的数量,每个住户的姓氏和每个住户的数量。这么多就好了。不过,我现在正试图创建每个个体,以生成名字、性别、年龄和职业,我还希望将这些数据存储在一个列表中,其中包含每个人的属性。我遇到的问题是我想使用for循环,比如:

    #houseArray[currentFam][1] is the number of members in the current house. 
    for currentFam in range(houseArray[currentFam][1]):
        uniquelyNamedArray[0] = genSex()
        uniquelyNamedArray[1] = genFirstName()
        uniquelyNamedArray[2] = genAge()

所以。。。查看第一个家庭的数据,使用for循环遍历每个成员分配的统计数据,然后转到下一个家庭并执行相同的操作,在每个家庭中进行。我的问题在于不知道如何为for循环创建的每个数组分配唯一的名称。名字是什么并不重要,只要每个人都有自己的唯一命名数组来存储他们的属性,就可以是任何东西。


Tags: the数据in名称for数量属性家庭
3条回答

Keep data out of your variable names并将它们存储在dict中。

用一本以人名为钥匙的字典。比如:

people = {}
people["Billy Bloggs"] = ['23','Male','263 Evergreen Tce'] # store to dict
print ( people["Billy Bloggs"] ) # get stuff out of dict

更好的方法是,将属性名称也存储为dict:

people["Billy Bloggs"] = { 'Age':23, 'Gender':'M', 'Address':'263 Evergreen Tce' }
print ( people["Billy Bloggs"]['Age'] ) # Get billy's age

可以使用以下语法循环遍历字典的元素:

>>> mydict = {'a':'Apple', 'b':'Banana', 'c':'Cumquat'}
>>> for key, value in mydict.iteritems():
...     print ('Key is :' + key + ' Value is:' + value)
... 
Key is :a Value is:Apple
Key is :c Value is:Cumquat
Key is :b Value is:Banana

请注意,不能保证数据的顺序。您可以按A, B, C的顺序插入数据,然后返回A, C, B

注意:dict的键(在本例中是人名)被限制为唯一的。因此,如果将数据存储到同一个名称两次,那么第一个key:value对将被覆盖。

mydict["a"] = 5
mydict["a"] = 10
print (mydict["a"]) # prints 10

旁注:您的一些gen*()函数几乎肯定可以被random.choice()替换:

import random
first_names = ['Alice','Bob','Charlie','Dick','Eliza']
random_first_name = random.choice(first_names)

首先,虽然您没有向我们展示周围的代码,但您可能过于依赖全局变量。与其尝试为每个族成员创建唯一命名的数组,不如执行以下操作:

别这么做(我马上告诉你原因)

#houseArray[currentFam][1] is the number of members in the current house. 
for currentFam in range(houseArray[currentFam][1]):
    family_member_info = []
    family_member_info[0] = genSex()
    family_member_info[1] = genFirstName()
    family_member_info[2] = genAge()
    # Pretend 2 is where we are storing the family member information list
    houseArray[currentFam][2].append(family_member_info)

更好的方法

不要使用数组来做这种事情-很难很快判断哪个索引中实际存储了什么。即使在您的示例中,您也必须注意到houseArray[currentFam][1]正在存储当前房屋中的成员数。

我会使用dictionarynamed tuple并将您的信息存储在其中。你可以这样做:

from collections import namedtuple

# Create a class called "household"
# with three fields, "owner", "size" and "members"
household = namedtuple("household", "owner size members")

househould_array = []
# Create some households and put them in the array
household_array.append(household("Family #1", 3, []))
household_array.append(household("Family #2", 1, []))
household_array.append(household("Family #3", 7, []))

# Loop over every household in the household_array
for family in household_array:
    # Each `household` namedtulpe's values can be accessed by
    # attribute as well as by index number
    # family[1] == family.size == 3
    # (for Family #1)
    for member_number in range(family.size):
        # family[2] == family.members == []
        # (before we put anything in it)
        family.members.append(generate_family_member())

相关问题 更多 >