4

要素の数が不均一なリストのリストがあります。

[['a','b','c'], ['d','e'], [], ['f','g','h','i']]

Reportlabにテーブルを表示していますが、それらを列として表示したいと思います。私が理解しているように、RLは、上記の行形式のテーブル(Platypus)のデータのみを取得します。

ループを使用して切り替えを行うことはできますが、より高速でよりPythonicなリスト内包表記があるように感じます。要素が不足している列にも空白が必要です。

目的の製品は次のとおりです。

[['a','d','','f'],['b','e','','g'],['c','','','h'],['','','','i']]

編集:例は数字ではなく文字列である必要があります

助けてくれてありがとう!

4

5 に答える 5

11

itertools.izip_longest()fillvalue引数を取る。Python 3では、itertools.zip_longest()です。

>>> l = [[1,2,3], [4,5], [], [6,7,8,9]]
>>> import itertools
>>> list(itertools.izip_longest(*l, fillvalue=""))
[(1, 4, '', 6), (2, 5, '', 7), (3, '', '', 8), ('', '', '', 9)]

タプルの代わりにサブリストが必要な場合:

>>> [list(tup) for tup in itertools.izip_longest(*l, fillvalue="")]
[[1, 4, '', 6], [2, 5, '', 7], [3, '', '', 8], ['', '', '', 9]]

もちろん、これは文字列でも機能します。

>>> l = [['a','b','c'], ['d','e'], [], ['f','g','h','i']]
>>> import itertools
>>> list(itertools.izip_longest(*l, fillvalue=""))
[('a', 'd', '', 'f'), ('b', 'e', '', 'g'), ('c', '', '', 'h'), ('', '', '', 'i')]

それもこのように機能します:

>>> l = ["abc", "de", "", "fghi"]
>>> list(itertools.izip_longest(*l, fillvalue=""))
[('a', 'd', '', 'f'), ('b', 'e', '', 'g'), ('c', '', '', 'h'), ('', '', '', 'i')]
于 2012-12-15T15:27:48.173 に答える
1

別の方法は次のとおりです。

>>> map(lambda *z: map(lambda x: x and x or '', z), *l)
[['a', 'd', '', 'f'], ['b', 'e', '', 'g'], ['c', '', '', 'h'], ['', '', '', 'i']]
于 2012-12-15T16:06:00.867 に答える
1
grid = [['a','b','c'], ['d','e'], [], ['f','g','h','i']]
i = 0
result = []
do_stop = False
while not do_stop:
    result.append([])
    count = 0
    for block in grid:
        try:
            result[i].append(block[i])
        except:
            result[i].append('')
            count = count +1
            continue
    if count ==len(grid):
        result.pop(i)
        do_stop = True
    i = i + 1

print result
于 2018-03-25T12:01:24.080 に答える
0

空の文字列の代わりにNone値を許容できる場合は、さらに簡単だと思います。

a = [['a','b','c'], ['d','e'], [], ['f','g','h','i']]
map(lambda *z: list(z), *a)
#[['a', 'd', None, 'f'], ['b', 'e', None, 'g'], ['c', None, None, 'h'], [None, None, None, 'i']]
于 2012-12-15T16:10:30.637 に答える
0
map(lambda *z: [s if s else '' for s in z], *a)

また

map(lambda *z: [('', s)[s>None] for s in z], *a)
于 2013-07-18T15:50:36.533 に答える