たとえば、リストのリストをマージします
list_of_lists = [['NA','NA','NA','0,678'], ['0.327','NA','NA','NA'], ...]
私が欲しい
merged = ['0.327','NA','NA','0,678']
コメントしてください。
ネストされたジェネレーター式でリスト内包表記を使用して、最初の非NA
要素を選択しzip()
ます。
merged = [next((el for el in elements if el != 'NA'), 'NA') for elements in zip(*list_of_lists)]
デモ:
>>> list_of_lists = [['NA','NA','NA','0,678'], ['0.327','NA','NA','NA']]
>>> [next((el for el in elements if el != 'NA'), 'NA') for elements in zip(*list_of_lists)]
['0.327', 'NA', 'NA', '0,678']
next((...), default)
call 式は と等しくない最初の要素を選択し、そのような要素が存在しない場合は'NA'
にフォールバックします。'NA'
両方のリストが同じ位置に値を持っていないと仮定すると (Martijn Pieters によって提案されているように)、次を使用できます。
for i in range(len(l1)):
l1[i] = l2[i] if l1[i] == 'NA' and l2[i] != 'NA' else l1[i]
お役に立てれば!
>>> list_of_lists = [['NA','NA','NA','0,678'], ['0.327','NA','NA','NA']]
>>> from itertools import ifilter # Py3k doesn't need import, use filter built-in
>>> [next(ifilter('NA'.__ne__, col), 'NA') for col in zip(*list_of_lists)]
['0.327', 'NA', 'NA', '0,678']