0

リスト内の行数とリストのタプル内の列数が一定ではないタプルのリストがあります。すなわち

list = [(a1,b1, …z1), (a2,b2, …, z2),…. ,(am,bm, … , zm )]. これは SQL の結果と比較できます。SQL の列数が変化すると、タプルのリストでも列数が変化します。

リスト内のすべてのタプルの各要素を反復処理し、値に対していくつかのチェックを実行し、それを変換して、変更された値をタプルの新しいリストとして返す必要があります。

すなわち

list_value = [('name1', 1234, 'address1' ), ('name2', 5678, 'address2'), ('name3', 1011, 'addre"ss3')]

各値にアクセスして、値に二重引用符が含まれているかどうかを確認し、二重引用符を含む文字列を二重引用符で囲む必要があります (これはチェックの 1 つです)。変換が返されるはずです

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 に答える