Python嵌套理解和if语句不起作用

2024-05-13 08:47:46 发布

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

这里的问题是,如果da='Dagger',则代码按预期工作,并返回奇数。如果da='Dager',输入错误,则它不打印偶数,而b打印空列表。为什么?

we = [
    ["Dagger",           250,    None,   None,   200,    10,     None],
    ["Folding Stock",    500,    None,   None,   -300,   100,    None]]

da = "Dager"
print( da, we)
print()
weapon = [a for a in we if da in a]
print(weapon)
b = ["Even" if a == [] else "Odd" for a in we if da in a]

print('end', weapon, b)

使用错误的“dager”输入运行

Dager [['''big edit here'''

[]
[]
end [] []

使用良好的“匕首”输入运行

[['Dagger', 250, None, None, 200, 10, None]]
['Odd']
end [['Dagger', 250, None, None, 200, 10, None]] ['Odd']

Process finished with exit code 0

Tags: 代码innoneforif错误daend
3条回答

它不会输出您期望的内容,因为列表理解的不同部分执行的顺序不同

[a for a in we if da in a]

上面的一行根据we中的项目生成项目列表。该列表仅包括包含da的项。如果da是“Dagger”,则返回的列表包含一项,因为we中的一项包含字符串“Dagger”。如果da是“Dager”,则列表包含0项,因为we的任何项中都不存在“Dager”

第二个列表理解的工作原理类似,但在初始筛选之后应用额外的步骤

["Even" if a == [] else "Odd" for a in we if da in a]

此部分-"Even" if a == [] else "Odd"仅对通过筛选器的每个项目运行-if da in a。因为没有项目通过“Dager”的过滤器,所以偶数/奇数部分永远不会运行,从而导致空列表

这不是理解的问题。你说如果da='Dager'那么b是空的,这是意料之中的

尝试下面的方法,找出python为什么会这样做

print('Dagger' in ["Dagger", 250, None, None, 200, 10, None])
print('Dager' in ["Dagger", 250, None, None, 200, 10, None])

第一个打印为True,因为“匕首”==“匕首”

第二个打印为False,因为“Dager”!='匕首

如果希望python忽略“Dagger”中的“g”数量,则需要正则表达式

此外,在理解中使用嵌套if是一个坏主意,它缺乏可读性。试试过滤器

result = ['odd' if item else 'even'
          for item in filter(lambda item: da in item, weapons)]

结果将只包含“奇数”,因为项将始终至少包含da,这使得“if item”始终为真

若你们想把那个些嵌套列表变成“奇数”若包含da,你们应该使用map

result = list(map(lambda item: 'odd' if da in item else 'even', weapons))

更新:如果武器不在列表和子列表中,则返回错误

这更容易,你可以使用任何

def check_dagger(da, weapons):
    # this will return True if any sublist within weapons contains da
    # if you want to modify so that all sublist need to have da, use all
    return 'good' if any([da in item for item in weapons]) else 'error'
    # or you can raise an exception 
    if not any([da in item for item in weapons]):
        raise ValueError(f'{da} not in weapons')

这是因为你写的方式你列出了理解力。可以这么说,如果武器不在库存中,你就忽略了这个案子

正确的结构是:

[ expression if conditional else other thing if conditional2 for this many times ] 

您的代码:

b = ["Even" if a == [] else "Odd" for a in we if da in a]

追加"Even"{} "Odd"{}不正确

应该是"Odd" if da in a for each a in we!对于“偶数”的情况也适用

试试这个:

b = ["Even" if a == [] else "Odd" if da in a else 'not' for a in we]

相关问题 更多 >