1

私はこのようなpythonデータ構造を持っています

dl= [{'plat': 'unix',   'val':['', '',   '1ju', '', '',   '202', '',   '']},
     {'plat': 'Ios',    'val':['', '',   '',    '', 'Ty', '',    'Jk', '']},
     {'plat': 'NT',     'val':['', '',   1,     '', '' ,  '202', '',   '']},
     {'plat': 'centOs', 'val':['', '',   '',    '', '',   '202', '',   '']},
     {'plat': 'ubuntu', 'val':['', 'KL', '1',   '', '',   '',    '',   '9i0']}]
                                ^                ^
                                |                |
                                \                /
                                   Delete these 

'val'各リストの同じ列の値が空のリスト内の位置を削除しようとしています。たとえば、リスト (dl) の位置 0 と 3 です。私は次のような出力を得ようとしています:

Output= [{'plat': 'unix',   'val':['',   '1ju', '',   '202', '',   '']},
         {'plat': 'Ios',    'val':['',   '',    'Ty', '',    'Jk', '']},
         {'plat': 'NT',     'val':['',   1,     '' ,  '202', '',   '']},
         {'plat': 'centOs', 'val':['',   '',    '',   '202', '',   '']},
         {'plat': 'ubuntu', 'val':['KL', '1',   '',   '',    '',   '9i0']}]
4

4 に答える 4

3

これを 2 つの手順で行います。まず、削除するインデックスを見つけます。

lists = [e['val'] for e in dl]
idx_to_remove = [i for i, elem in enumerate(map(any, zip(*lists))) if not elem]

次に、元のリストをフィルタリングしましょう。

for l in lists:
    l[:] = [elem for i, elem in enumerate(l) if i not in idx_to_remove]

結果:

>>> pprint.pprint(dl)
[{'plat': 'unix', 'val': ['', '1ju', '', '202', '', '']},
 {'plat': 'Ios', 'val': ['', '', 'Ty', '', 'Jk', '']},
 {'plat': 'NT', 'val': ['', 1, '', '202', '', '']},
 {'plat': 'centOs', 'val': ['', '', '', '202', '', '']},
 {'plat': 'ubuntu', 'val': ['KL', '1', '', '', '', '9i0']}]
于 2013-10-03T15:29:06.517 に答える
2
dl= [{'plat': 'unix',   'val':['', '', '1ju', '', '', '202',  '',   '']},
     {'plat': 'Ios',    'val':['', '',  '',   '', 'Ty', '',     'Jk', '']},
     {'plat': 'NT',     'val':['', '',   1,   '', '' , '202', '',   '']},
     {'plat': 'centOs', 'val':['', '',  '',   '', '',  '202', '',   '']},
     {'plat': 'ubuntu', 'val':['', 'KL','1',  '', '',   '',   '',   '9i0']}]

def empty_indices(lst):
  return {i for i,v in enumerate(lst) if not v}

# Need to special-case the first one to initialize the set of "emtpy" indices.
remove_idx = empty_indices(dl[0]['val'])
# Here we do the first one twice.  We could use itertools.islice but it's 
# probably not worth the miniscule speedup.
for item in dl:
  remove_idx &= empty_indices(item['val'])

for item in dl:
    item['val'] = [k for i,k in enumerate(item['val']) if i not in remove_idx]

# print the results.
import pprint
pprint.pprint(dl)
于 2013-10-03T15:28:11.663 に答える
0
from itertools import izip
from operator import itemgetter

# create an iterator over columns
columns = izip(*(d['val'] for d in dl))

# make function keeps non-empty columns
keepfunc = itemgetter(*(i for i, c in enumerate(columns) if any(c)))

# apply function to each list
for d in dl:
    d['val'] = list(keepfunc(d['val']))
于 2013-10-03T15:27:32.500 に答える