0

我有一个元组列表,其中列表中的行数和列表的元组中的列数不是恒定的。IE

list = [(a1,b1, …z1), (a2,b2, …, z2),…. ,(am,bm, … , zm )]. 可以与SQL结果进行比较,随着sql中列数的变化,元组列表中的列数也会发生变化。

我必须遍历列表中每个元组的每个元素,对值执行一些检查,转换它并将修改后的值作为新的元组列表返回。

IE

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

有没有办法使用列表理解使代码简洁?

4

2 回答 2

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]
于 2013-09-20T21:41:12.177 回答
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"']]
于 2013-09-20T21:38:53.560 回答