如何检查列表中的字符串

时间:2013-05-15 00:20:28

标签: python for-loop

我有一个字符串:

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])

它不起作用!

3 个答案:

答案 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'