如果循环内的语句,则有两个条件

时间:2012-11-08 15:38:05

标签: python python-2.7 if-statement

过去一天我一直在努力解决一个非常简单(但令人沮丧的困难)的问题。我目前有一段代码,它使用csv reader逐行循环遍历csv文件。循环不是问题,因为我之前使用过相同的循环成功;这似乎与我的if语句有关。

以下是一个示例:

if  'INCORRECT_KEY_PRESSED' and 'rad_mod_KA_0043-lo-mod' in row:
            userAnswerColumn.append(row[20])
            userRtColumn.append(row[21])

如果该行包含短语INCORRECT_KEY_PRESSEDrad_mod_KA_0043-lo-mod,则此语句应附加两个列表,其中包含行中特定位置的值。我有几个这样的陈述,但是一行不会同时拥有这两个短语。像rad_mod_KA_0043-lo-mod这样的短语总是唯一的,而INCORRECT_KEY_PRESSED多次出现。

似乎if语句只使用我的一个条件,因为它会向每个列表附加多个数据。

我过去遇到过这个问题,并通过创建集合并执行类似的操作来解决它:

if (all(x in row for x in ssSet) and row[14] == '7'):
            ssColumn7.append(row[20])
            ssRtColumn7.append(row[21])

但是,有很多独特的术语,我必须制作过多的套装。出了什么问题?

3 个答案:

答案 0 :(得分:3)

声明'INCORRECT_KEY_PRESSED' and 'rad_mod_KA_0043-lo-mod' in row被解释为:

('INCORRECT_KEY_PRESSED') and ('rad_mod_KA_0043-lo-mod' in row)

第一部分始终为True(非空字符串是'truthy',或在布尔表达式中被视为布尔值True。)

你可能想要:

if 'INCORRECT_KEY_PRESSED' in row and 'rad_mod_KA_0043-lo-mod' in row:

相反,或者你可以使用set intersection:

if {'INCORRECT_KEY_PRESSED', 'rad_mod_KA_0043-lo-mod'}.intersection(row):

答案 1 :(得分:0)

你的分组错误,python的作用如下:

if  ('INCORRECT_KEY_PRESSED') and ('rad_mod_KA_0043-lo-mod' in row):

所以你需要:

if  ('INCORRECT_KEY_PRESSED' in row) and ('rad_mod_KA_0043-lo-mod' in row):

答案 2 :(得分:0)

if  'INCORRECT_KEY_PRESSED' and 'rad_mod_KA_0043-lo-mod' in row:
            userAnswerColumn.append(row[20])
            userRtColumn.append(row[21])

应更改为:

if  ('INCORRECT_KEY_PRESSED'  in row) and ('rad_mod_KA_0043-lo-mod' in row):
            userAnswerColumn.append(row[20])
            userRtColumn.append(row[21])

因为否则python会理解

if ('INCORRECT_KEY_PRESSED') and 'rad_mod_KA_0043-lo-mod' in row:

可能总是如此。

每次有多个条件要测试时,您可能需要考虑这个问题。