web-dev-qa-db-ja.com

pythonのインデックスを使用してリストのサブセットを持つ新しいリストを作成する

リスト:

a = ['a', 'b', 'c', 3, 4, 'd', 6, 7, 8]

使用しているa[0:2],a[4], a[6:]のサブセットを使用したリストが必要です。

つまり、リストが必要です['a', 'b', 4, 6, 7, 8]

18
user2783615

new_list = a[0:2] + [a[4]] + a[6:]

またはより一般的には、このようなもの:

from itertools import chain
new_list = list(chain(a[0:2], [a[4]], a[6:]))

これは他のシーケンスでも機能し、より高速になる可能性があります。

または、これを行うことができます:

def chain_elements_or_slices(*elements_or_slices):
    new_list = []
    for i in elements_or_slices:
        if isinstance(i, list):
            new_list.extend(i)
        else:
            new_list.append(i)
    return new_list

new_list = chain_elements_or_slices(a[0:2], a[4], a[6:])

ただし、リスト内の要素の一部がそれ自体リストである場合、これは問題を引き起こすことに注意してください。これを解決するには、以前のソリューションのいずれかを使用するか、a[4] with a[4:5](またはより一般的にはa[n] with a[n:n+1])。

20
rlms

仮に

a = ['a', 'b', 'c', 3, 4, 'd', 6, 7, 8]

インデックスのリストは

b= [0, 1, 2, 4, 6, 7, 8]

単純な1行のソリューションは

c = [a[i] for i in b]
24
G. Cohen

次の定義は、最初に提案されたソリューションよりも効率的かもしれません

def new_list_from_intervals(original_list, *intervals):
    n = sum(j - i for i, j in intervals)
    new_list = [None] * n
    index = 0
    for i, j in intervals :
        for k in range(i, j) :
            new_list[index] = original_list[k]
            index += 1

    return new_list

以下のように使用できます

new_list = new_list_from_intervals(original_list, (0,2), (4,5), (6, len(original_list)))
1
Aurélien Ooms