尝试通过交互式可视化器运行它,比如这个。如果由于某种原因你不能这样做,至少尝试在普通的交互式解释器中进行试验,或者在你的程序中打印出中间结果。
什么时候a
是“天高”,并且row
是["sky high and high",'88']
,这意味着row[0]
是"sky high and high"
,所以a in row[0]
是True
。
这就是为什么(如果您将其修复为使用[1]
而不是[2]
)它将同时打印77
和88
。
在交互式解释器(或可视化器)上试试这个:
>>> a = "sky high"
>>> mylist = [["sky high",'77'],["sky high and high",'88']]
>>> row = mylist[1]
>>> row[0]
"sky high and high"
>>> a in row[0]
True
同时,您说“我不知道为什么我不能使用if a == row[0]
,因为它不会产生任何结果。”
但是如果你使用a == row[0]
它不会产生任何结果;它会产生77
.
在交互式解释器(或在线可视化器)中试试这个:
>>> a = "sky high"
>>> mylist = [["sky high",'77'],["sky high and high",'88']]
>>> for row in mylist:
... if a == row[0]:
... print row[1]
77
因此,您必须在代码的其他部分存在错误。向我们展示您声称不起作用的版本,我们可以找到错误。
最有可能的是,您的真实代码的问题在于row
(或者实际上,d
)实际上不是["sky high", '77']
,而是其中包含额外字符的东西:
data = open("text.qrel",'rb')
new = []
for row in data:
d = row[:-1].split(',')
假设text.qrel
看起来像这样:
sky high , 77
这将使d[0]
be "sky high "
(带空格),而不是"sky high"
.
或者:
"sky high",'77'
然后d[0]
将是'"sky high"'
(带有额外引号),而不是"sky high"
.
您可以向我们展示该 CSV 文件的摘录,或者让您的代码打印出每一行并向我们展示它打印的内容;否则,我们只是猜测。
您可以尝试手动修复问题。例如,要处理上述两种情况,而不是这样:
d = row[:-1].split(',')
......你会这样做:
def remove_quotes(x):
if x[0] == '"' and x[-1] == '"': return x[1:-1]
elif x[0] == "'" and x[-1] == "'": return x[1:-1]
else: return x
for row in data:
d = [remove_quotes(col.strip()) for col in row[:-1].split(',')]
如果你不理解列表推导,这一行:
d = [remove_quotes(col.strip()) for col in row[:-1].split(',')]
… 是一个快捷方式:
d = []
for col in row[:-1].split(','):
d.append(remove_quotes(col.strip())
您已经拥有[:-1]
删除尾随\n
和split(',')
拆分为两列。但是,我不只是按原样使用列,而是调用strip()
以删除边缘处的任何额外空格(在您的特定情况下这无关紧要,但这是 CSV 中的常见问题),然后调用remove_quotes
在结果上删除任何匹配的引号对,并将其用于列值。
如您所见,这既乏味又复杂。
还有很多常见的情况它无法处理。
这正是您通常想要使用该csv
模块而不是尝试自己解析 CSV 文件的原因:
for d in csv.reader(data):
现在,d[0]
将"sky high"
。
reader
如果你的 CSV 文件不是很“标准”——不足以让 CSV 处理开箱即用,你可以给 .自己从头开始。