1

csv ファイルで、特定の文字を他の文字に置き換えようとしています。

私の現在のコードはこれに似ています:

import csv

set1 = set('abc')
set2 = set('def')
set3 = set('ghi')

with open(path, 'r') as input, open(path2, 'w') as output:
    reader = csv.reader(input)
    writer = csv.writer(output)

    for row in reader:
            newrow = row
            newrow = [''.join('x' if c in set1 else c for c in item) for item in newrow]
            newrow = [''.join('y' if c in set2 else c for c in item) for item in newrow]
            newrow = [''.join('z' if c in set3 else c for c in item) for item in newrow]

            writer.writerow(newrow)

この例では、ジェネレータ式を 3 つしか使用していませんが、簡単にそれ以上にすることもできます。

これを行う正しい方法を知っている人はいますか?私の懸念は、この構造が最速ではない可能性があることです (そして確かに最適に見えません)。

4

3 に答える 3

2

ループを使用して、さまざまな部分をパラメーター化できます。

newrow = row
for v, s in (('x', set1), ('y', set2), ('z', set3)):
    newrow = [''.join(v if c in s else c for c in item) for item in newrow]

文字を置き換える場合は、セットではなくマッピングを使用してください。

mapping = dict.fromkeys(set1, 'x')
mapping.update(dict.fromkeys(set2, 'y'))
mapping.update(dict.fromkeys(set3, 'z'))
for row in reader:
    newrow = [''.join(mapping.get(c, c) for c in item) for item in newrow]
于 2014-12-20T23:06:06.963 に答える
2

str.translate適切かもしれません。の線に沿った何か

replacements = [
    ('abc', 'x'),
    ('def', 'y'),
    ('ghi', 'z'),
]

trans = str.maketrans({ k: v for l, v in replacements for k in l })

new_row = [item.translate(trans) for item in row]
于 2014-12-20T23:08:57.430 に答える
1

Here is something that combines both answers in some way and works great (multiple times faster than the code in the question):

replacements = [
('abc', 'x'),
('def', 'y'),
('ghi', 'z'),
]

mapping = {a: b for c, b in replacements for a in c}

for row in reader:
    newrow = [''.join(mapping.get(c, c) for c in item) for item in row]
    writer.writerow(newrow)
于 2014-12-21T16:00:30.837 に答える