3

私は2つのリストを持っています:

a=[[10, 0], [12,1], [13, 8], [2, -3]]
b=[1, 2, -30, 404]

結果が次のようになるように、値を のa[*][1]値に置き換えたいと思います。b

[[10, 1], [12, 2], [13, -30], [2, 404]]

明白な方法 (私にとっては、実際にはCプログラマー) は次のようになります。

for i in range(len(a)):
   a[i][1]=b[i]

しかし、どういうわけか、これはあまりPythonicではありません。

どうすればpythonicな方法でそれを行うことができますか?

さらに、b-list は よりも多いまたは少ない要素を持つことができますa。少ない場合、残りの要素は変更されaません。

a=[[10, 0], [12,1], [13, 8], [2, -3]]
b=[10, 20]

result=[[10, 10], [12,20], [13, 8], [2, -3]]

それ以上の場合は、デフォルトの最初の要素を持つ新しいエントリを追加したいと思います (例: None)

a=[[10, 0], [12,1]]
b=[100, 200, -30, 404]

result=[[10, 100], [12,200], [None, -30], [None, 404]]

これはリスト内包表記で達成できますか?

4

3 に答える 3

2

使用zipとリストの理解:

>>> a[:] = [[x, z] for (x, y), z   in zip(a, b)]
>>> a
[[10, 1], [12, 2], [13, -30], [2, 404]]

リストの長さが等しくない場合は、次を使用できますiterools.izip_longest

>>> from itertools import izip_longest
>>> a = [[10, 0], [12,1], [13, 8], [2, -3]]
>>> b = [10, 20]
>>> sen = object()
#len(a) > len(b)
>>> a[:] = [[x, y if z is sen else z]
                          for (x, y), z in izip_longest(a, b, fillvalue=sen)]
>>> a
[[10, 10], [12, 20], [13, 8], [2, -3]]

>>> a = [[10, 0], [12,1]]
>>> b = [100, 200, -30, 404]
#len(b) > len(a)
>>> a[:] = [[None if x is sen else x , z] 
                          for (x, y), z in izip_longest(a, b, fillvalue=[sen]*2)]
>>> a
[[10, 100], [12, 200], [None, -30], [None, 404]]

generator functionリスト内包表記が読みにくいと思われる場合は、 を使用します。

def solve(a, b):
    sen = object()
    if len(a) == len(b):
        for (x, y), z in zip(a, b):
            yield [x, z]
    elif len(a) > len(b):
        for (x, y), z in izip_longest(a, b, fillvalue=sen):
            yield [x, y if z is sen else z]
    else:
        for (x, y), z in izip_longest(a, b, fillvalue=[sen]*2):
            yield [None if x is sen else x , z]

デモ:

>>> list(solve([[10, 0], [12,1], [13, 8], [2, -3]], [1, 2, -30, 404]))
[[10, 1], [12, 2], [13, -30], [2, 404]]

>>> list(solve([[10, 0], [12,1], [13, 8], [2, -3]], [10, 20]))
[[10, 10], [12, 20], [13, 8], [2, -3]]

>>> list(solve([[10, 0], [12,1]], [100, 200, -30, 404]))
[[10, 100], [12, 200], [None, -30], [None, 404]]
于 2013-10-02T16:28:37.533 に答える
1

リスト内包表記を使用して、これを試してください。

if len(a) > len(b):
    result = [[e[0], b[i]] if i < len(b) else e for i, e in enumerate(a)]
else:
    result = [[a[i][0], e] if i < len(a) else [None, e] for i, e in enumerate(b)]

上記は、質問で説明されている3つのケースを考慮しています.Pythonicであるかどうかはあなた次第ですが、正しい結果が得られ、それが最も重要です.

于 2013-10-02T16:36:11.777 に答える