我有一个字符串:
a = "sky high"
以及我打开并转换为列表的csv样式的文件:
mylist = [["sky high",'77'],["sky high and high",'88']]
我想检查字符串是否存在于每个列表的第一个位置。但是,如果我这样做:
for row in mylist:
if a in row[0]:
print row[1]
它会给我结果77 88
而不只是77
。我不知道为什么我不能使用if a == row[0]
,因为它不会产生任何结果。知道该怎么做吗?
编辑:
所以实际上我的代码看起来像这样:
data = open("text.qrel",'rb')
new = []
for row in data:
d = row[:-1].split(',')
if a == d[0]:
new.append(d[1])
它不起作用!
答案 0 :(得分:2)
尝试通过交互式可视化工具(例如this one)运行此功能。如果由于某种原因无法做到这一点,至少尝试在普通的交互式解释器中进行试验,或在程序中打印出中间结果。
当a
为"天高",row
为["sky high and high",'88']
时,这意味着row[0]
为"sky high and high"
,所以{{ 1}}是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]
(带空格),而不是"sky high "
。
或者:
"sky high"
然后"sky high",'77'
将d[0]
(带引号),而不是'"sky high"'
。
您可以向我们展示该CSV文件的摘录,或者让您的代码打印出每一行并向我们展示它打印的内容;否则,我们只是在猜测。
您可以尝试手动修复内容。例如,要处理上述两种情况,而不是:
"sky high"
......你做了:
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(',')
以删除边缘处的任何额外空格(在特定情况下这并不重要,但这是CSV中的常见问题),然后在结果上调用strip()
以删除任何匹配的引号对,并使用 作为列值。
正如你所看到的那样,这很繁琐复杂。
还有很多常见案例无法处理。
这正是您通常希望使用the csv
module而不是尝试自己解析CSV文件的原因:
remove_quotes
现在,for d in csv.reader(data):
将为d[0]
。
如果您的CSV文件不完全"标准" - 足以让CSV处理开箱即用,您可以将方言对象或仅一些格式参数提供给"sky high"
,它通常比尝试从头开始构建它更容易。
答案 1 :(得分:1)
你问的是字符串sky high
是否在每行的第一个字符串中,而不是字符串在行中。这段代码应该做你想要的:
for row in mylist:
if a == row[0]:
print row[1]
这只会输出77
。
答案 2 :(得分:0)
对于您的示例,您需要使用row[1]
。然后它应该与==
一起使用
in
检查字符串是否在另一个字符串中,“sky high and high”包含“sky high”,这是正确的。
>>> a = "sky high"
>>> mylist = [["sky high",'77'],["sky high and high",'88']]
>>> for row in mylist:
... if a == row[0]:
... print row[1]
77
如果你喜欢单行,你也可以使用list comprehension来做这么简单的事情:
>>> [row[1] for row in mylist if a == row[0]][0]
'77'