我有一个元组列表,其中列表中的行数和列表元组中的列数不会是常量。即。
list = [(a1,b1, …z1), (a2,b2, …, z2),…. ,(am,bm, … , zm )]
。它可以与SQL结果进行比较,因为sql中的列数发生了变化,列数也会在元组列表中发生变化。
我必须遍历列表中每个元组的每个元素,对值执行一些检查,转换它并将修改后的值作为新的元组列表返回。
即
list_value = [('name1', 1234, 'address1' ), ('name2', 5678, 'address2'), ('name3', 1011, 'addre"ss3')]
我需要访问每个值以检查该值是否包含双引号并将包含带双引号的双引号的字符串括起来(这将是其中一项检查)。转换应该返回
list_value = [('name1', 1234, 'address1' ), ('name2', 5678, 'address2'), ('name3', 1011, '"addre"ss3"')]
对我来说最简单的方法就是这样做:
mod_val = [transform(row) for row in list_value]
def transform(row):
mod_list=[]
while index < len(row):
... if isinstance(row[index],basestring):
... if '"' in row[index]:
... mod_list.append('"'+row[index]+'"')
... else:
... mod_list.append(row[index])
... index = index+1
... return mod_list
有没有办法使用列表理解使代码简洁?
答案 0 :(得分:1)
您可以嵌套列表理解:
mod_val = [['"{}"'.format(v) if isinstance(v, basestring) and '"' in v else v
for v in row]
for row in list_value]
您的transform()
函数无法在其中添加字符串而不使用引号,即使您的示例输出指示应该通过未更改的字符串传递。
演示:
>>> list_value = [('name1', 1234, 'address1' ), ('name2', 5678, 'address2'), ('name3', 1011, 'addre"ss3')]
>>> [['"{}"'.format(v) if isinstance(v, basestring) and '"' in v else v
... for v in row]
... for row in list_value]
[['name1', 1234, 'address1'], ['name2', 5678, 'address2'], ['name3', 1011, '"addre"ss3"']]
答案 1 :(得分:1)
如果你真的想要列表理解:
mod_val = [['"'+item+'"' if (isinstance(item, str) and '"' in item) else item for item in row] for row in list_value]
虽然我建议
def transform(row):
for item in row:
if isinstance(item, basestring) and '"' in item:
item = '"{}"'.format(item)
yield item
mod_val = [list(transform(row)) for row in list_value]
或
def transform(row):
if isinstance(item, str) and '"' in item:
return '"{}"'.format(item)
return item
mod_val = [map(transform, row) for row in list_value]