Python 列表理解中的动态变量

Python 列表理解中的动态变量,python,python-3.x,list-comprehension,Python,Python 3.x,List Comprehension,我正在尝试创建一个字典列表,其中包含基于另一个变量的值 from random import choice, randint male_names = [ 'Bob', 'John' ] female_names = [ 'Alice', 'Cathrine' ] mylist = [ dict( name = choice( male_names if is_male else female_names ), gender = 'male' if i

我正在尝试创建一个字典列表,其中包含基于另一个变量的值

from random import choice, randint

male_names = [ 'Bob', 'John' ]
female_names = [ 'Alice', 'Cathrine' ]

mylist = [
    dict(
        name = choice( male_names if is_male else female_names ),
        gender = 'male' if is_male else 'female'
    )
    for _ in range(10)
    if (is_male := randint(1, 2))
]
正如您在这里的代码中所看到的,
name
gender
都取决于
is\u male
变量。在本例中,
是男性的
将是1或2,而不是真或假。问题是,由于if条件,如果
is_-male
为False,它将继续进行下一次迭代,而不做任何事情。另一个问题是if条件使其可读性降低

有没有一种方法可以在不使用if条件的情况下在列表中添加变量? 大概是这样的:

from random import choice, randint

male_names = [ 'Bob', 'John' ]
female_names = [ 'Alice', 'Cathrine' ]

mylist = [
    dict(
        name = choice( male_names if is_male == 1 else female_names ),
        gender = 'male' if is_male == 1 else 'female'
    )
    for _ in range(10)
    is_male := choice([True, False])
]

生成一系列的
is_male
值,并进行转换:


生成一系列的
is_male
值,并进行转换:


如果你在理解中表达逻辑有困难,我建议你用循环代替。是的,最后我想我会的。我只是好奇是否可以在一个理解的环境下做这件事。谢谢。只需使用for循环。如果你写的代码像
(is_male:=randint(1,2))
只是为了把东西塞进列表理解,这是一个很好的迹象,你不应该使用列表理解如果你在理解中表达逻辑有困难,我建议你改为使用循环。是的,最后我想我会的。我只是好奇是否可以在一个理解的环境下做这件事。谢谢。只需使用for循环。如果你写的代码像
(is_male:=randint(1,2))
只是为了把东西塞进列表理解,这是一个很好的迹象,你不应该使用列表理解
mylist = [
    {
        name: choice(male_names if is_male else female_names),
        gender: 'male' if is_male else 'female'
    }
    for is_male in (choice([True, False]) for _ in range(10))
]