0

我有一个字符串:

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. 我不知道为什么我不能使用 ifa == row[0]因为它不会产生任何结果。知道该怎么做吗?

编辑:

所以实际上我的代码看起来像这样:

data = open("text.qrel",'rb')
new = []
for row in data:
    d = row[:-1].split(',')

    if a == d[0]:
       new.append(d[1])

它不起作用!

4

3 回答 3

2

尝试通过交互式可视化器运行它,比如这个。如果由于某种原因你不能这样做,至少尝试在普通的交互式解释器中进行试验,或者在你的程序中打印出中间结果。


什么时候a是“天高”,并且row["sky high and high",'88'],这意味着row[0]"sky high and high",所以a in row[0]True

这就是为什么(如果您将其修复为使用[1]而不是[2])它将同时打印7788

在交互式解释器(或可视化器)上试试这个:

>>> 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]删除尾随\nsplit(',')拆分为两列。但是,我不只是按原样使用列,而是调用strip()以删除边缘处的任何额外空格(在您的特定情况下这无关紧要,但这是 CSV 中的常见问题),然后调用remove_quotes在结果上删除任何匹配的引号对,并将用于列值。

如您所见,这既乏味又复杂。

还有很多常见的情况它无法处理。

这正是您通常想要使用csv模块而不是尝试自己解析 CSV 文件的原因:

for d in csv.reader(data):

现在,d[0]"sky high"

reader如果你的 CSV 文件不是很“标准”——不足以让 CSV 处理开箱即用,你可以给 .自己从头开始。

于 2013-05-15T00:24:43.653 回答
1

您问的是字符串sky high是否在每行的第一个字符串中,而不是字符串是否在行中。这段代码应该做你想做的事:

for row in mylist:
    if a == row[0]:
       print row[1]

这只输出77.

于 2013-05-15T00:24:03.650 回答
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

如果你喜欢单行,你也可以使用列表推导来做这样简单的事情:

>>> [row[1] for row in mylist if a == row[0]][0]
'77'
于 2013-05-15T00:24:43.837 回答