Python 如何检查列表中的字符串
我有一个字符串:Python 如何检查列表中的字符串,python,for-loop,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] 它将给我结果7788,而不仅仅是77。我不知道为什么不能使用ifa==row[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]
它将给我结果7788
,而不仅仅是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])
sky high , 77
但它不起作用 您询问的是字符串是否在每行的第一个字符串中,而不是字符串是否在该行中。此代码应执行您想要的操作:
for row in mylist:
if a == row[0]:
print row[1]
这只输出
77
您询问的字符串是否位于每行的第一个字符串中,而不是该字符串是否位于该行中。此代码应执行您想要的操作:
for row in mylist:
if a == row[0]:
print row[1]
这只输出
77
请尝试通过交互式可视化工具运行它,如。当你因为某种原因不能这样做时,至少试着在普通的交互式解释器中进行实验,或者在你的程序中打印中间结果
当
a
是“天高”,而行是[“天高”,“88']
时,这意味着行[0]
是行[0]
中的a是真的
这就是为什么(如果您将其修复为使用[1]
而不是[2]
),它将同时打印77
和88
在交互式解释器(或可视化工具)上尝试以下操作:
同时,您会说“如果a==行[0]
,我不知道为什么不能使用,因为它不会产生任何结果。”
但是如果使用a==行[0]
则不会产生任何结果;它将产生77
在交互式解释器(或在线可视化工具)中尝试以下操作:
因此,代码的其他部分中肯定有bug。向我们展示您声称不起作用的版本,我们就能找到bug
最有可能的是,实际代码的问题在于行
(或者实际上是d
)实际上不是[“天高”,“77']
,而是包含额外字符的内容:
data = open("text.qrel",'rb')
new = []
for row in data:
d = row[:-1].split(',')
比如说text.qrel
看起来像这样:
data = open("text.qrel",'rb')
new = []
for row in data:
d = row[:-1].split(',')
if a == d[0]:
new.append(d[1])
sky high , 77
这将使d[0]
成为“天高”
(带空格),而不是“天高”
或:
那么d[0]
将是“天高”
(加上额外的引号),而不是“天高”
您可以向我们展示该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
和拆分(',')
来拆分为两列。但是,在每一列上,我都调用strip()
来删除边缘的任何额外空白(这在您的特定情况下并不重要,但在CSV中这是一个常见问题),然后在结果上调用remove_quotes
,删除任何匹配的引号对,并将其用作列值
正如你所看到的,这既乏味又复杂
而且还有很多普通案件它无法处理
这正是您通常希望使用而不是自己尝试解析CSV文件的原因:
for d in csv.reader(data):
现在,d[0]
将成为“天高”
如果您的CSV文件不太“标准”——不足以让CSV开箱即用,您可以给阅读器提供一个方言对象,或者只是一些格式参数,这通常比自己从头开始构建要容易。尝试通过交互式可视化工具运行它,如。当你因为某种原因不能这样做时,至少试着在普通的交互式解释器中进行实验,或者在你的程序中打印中间结果
当a
是“天高”,而行是[“天高”,“88']
时,这意味着行[0]
是行[0]
中的a是真的
这就是为什么(如果您将其修复为使用[1]
而不是[2]
),它将同时打印77
和88
在交互式解释器(或可视化工具)上尝试以下操作:
同时,您会说“如果a==行[0]
,我不知道为什么不能使用,因为它不会产生任何结果。”
但是如果使用a==行[0]
则不会产生任何结果;它将产生77
在交互式解释器(或在线可视化工具)中尝试以下操作:
因此,代码的其他部分中肯定有bug。向我们展示您声称不起作用的版本,我们就能找到bug
最有可能的是,实际代码的问题在于行
(或者实际上是d
)实际上不是[“天高”,“77']
,而是包含额外字符的内容:
data = open("text.qrel",'rb')
new = []
for row in data:
d = row[:-1].split(',')
比如说text.qrel
看起来像这样:
data = open("text.qrel",'rb')
new = []
for row in data:
d = row[:-1].split(',')
if a == d[0]:
new.append(d[1])
sky high , 77
这将使d[0]
成为“天高”
(带空格),而不是“天高”
或:
那么d[0]
将是“天高”
(加上额外的引号),而不是“天高”
您可以向我们展示该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