4

次のようなデータ構造から始めたいと思います。

[[0,   12,  25,  45,  65,  100],
 [0,   0,   0,   255, 255, 255],
 [0,   0,   255, 255, 0,   0],
 [255, 255, 0,   0,   0,   0]]

に:

[[0,   12,  12, 25,   25,  45,  45,  65,  65, 100],
 [0,   0,   0,   0,   0,   255, 255, 255, 255, 255],
 [0,   0,   0,   255, 255, 255, 255, 0,   0,   0],
 [255, 255, 255, 0,   0,   0,   0,   0,   0,   0]]

(最初と最後の列を除くすべての列が繰り返されます)。

私は機能する次のリスト内包を持っています:

[[l[0]] + [x for sl in [[i, i] for i in l[1:-1]] for x in sl] + [l[-1]] for l in list_of_lists] 

しかし、これを書くためのよりエレガントで読みやすい方法があるかどうか疑問に思いました。

4

3 に答える 3

2

これを書くためのよりエレガントで読みやすい方法があるかどうか疑問に思いました。

また、「読みやすい」というのは、「これを一行に詰め込めるのか」と必ずしも同じではないということも考えておくべきだと思います。多くの場合、より明示的で単純な反復コードを意味する場合があります。おそらく、この関数の方が読みやすいかもしれません。

>>> def double_middle_items(l):
        if len(l) < 2:
            raise ValueError("there must be at least two items in l")

        result = [l[0]]
        for item in l[1:-1]:
            result.append(item)
            result.append(item)
        result.append(l[-1])
        return result

>>> double_middle_items([1,2,3,4,5])
[1, 2, 2, 3, 3, 4, 4, 5]

次に、コードは非常に単純になります。

>>> [double_middle_items(l) for l in list_of_lists]
于 2012-05-04T09:03:30.337 に答える
2
>>> from itertools import chain
>>> data = [[0,   12,  25,  45,  65,  100], [0,   0,   0,   255, 255, 255], [0, 0, 255, 255, 0,   0], [255, 255, 0,   0,   0,   0]]
>>> [list(chain.from_iterable(zip(l,l[1:]))) for l in data]
[[0, 12, 12, 25, 25, 45, 45, 65, 65, 100], [0, 0, 0, 0, 0, 255, 255, 255, 255, 255], [0, 0, 0, 255, 255, 255, 255, 0, 0, 0], [255, 255, 255, 0, 0, 0, 0, 0, 0, 0]]
于 2012-05-04T09:04:47.083 に答える
2

あなたのリストを

>>> spam=[[0,   12,  25,  45,  65,  100],
 [0,   0,   0,   255, 255, 255],
 [0,   0,   255, 255, 0,   0],
 [255, 255, 0,   0,   0,   0]]

リストの各要素の複製を連鎖させることができます

>>> from itertools import repeat,chain
>>> [list(chain(*([i]*2 for  i in r)))[1:-1]  for r in spam]
[[0, 0, 12, 12, 25, 25, 45, 45, 65, 65, 100, 100], [0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255], [0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0], [255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0]]

または繰り返しを使用して

>>> [list(chain(*(repeat(i,2) for  i in r)))[1:-1]  for r in spam]
于 2012-05-04T09:05:21.390 に答える