web-dev-qa-db-ja.com

Python Listのいくつかのリスト項目をマージします

次のようなリストがあるとします:

[a, b, c, d, e, f, g]

このリストを次のように変更するにはどうすればよいですか?

[a, b, c, def, g]

新しいリストを作成するのではなく、既存のリストを直接変更することをお勧めします。

34
Leslie

どのような基準でマージを行う必要がありますか?あなたの質問はかなりあいまいです。また、a、b、...、fは文字列、つまり「a」、「b」、...、「f」であると想定されています。

>>> x = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> x[3:6] = [''.join(x[3:6])]
>>> x
['a', 'b', 'c', 'def', 'g']

シーケンスタイプ 、特に 可変シーケンスタイプ に関するドキュメントを参照してください。そしておそらく stringメソッド でも。

50
Stephan202

その例はかなりあいまいですが、おそらくこのようなものですか?

items = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
items[3:6] = [''.join(items[3:6])]

基本的にスプライス(または スライスへの割り当て )操作を行います。アイテム3〜6を削除し、その場所に新しいリストを挿入します(この場合、削除された3つのアイテムの連結である1​​つのアイテムを持つリスト)。

どのタイプのリストでも、これを行うことができます(タイプが何であれ、すべてのアイテムで+演算子を使用):

items = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
items[3:6] = [reduce(lambda x, y: x + y, items[3:6])]

これは、基本的に+演算子を使用して項目を一緒に追加する reduce 関数で lambda 関数を使用します。

33
Blixt

ただのバリエーション

alist=["a", "b", "c", "d", "e", 0, "g"]
alist[3:6] = [''.join(map(str,alist[3:6]))]
print alist
5
ghostdog74

私のテレパシー能力は特に優れているわけではありませんが、ここにあなたが望むと思うものがあります:

def merge(list_of_strings, indices):
    list_of_strings[indices[0]] = ''.join(list_of_strings[i] for i in indices)
    list_of_strings = [s for i, s in enumerate(list_of_strings) if i not in indices[1:]]
    return list_of_strings

明らかではないかもしれないので、他の回答で提案されているものと同じではないことに注意してください。

0
SilentGhost

もちろん、@ Stephan202は本当にいい答えをしてくれました。私は代替手段を提供しています。

def compressx(min_index = 3, max_index = 6, x = ['a', 'b', 'c', 'd', 'e', 'f', 'g']):
    x = x[:min_index] + [''.join(x[min_index:max_index])] + x[max_index:]
    return x
compressx()

>>>['a', 'b', 'c', 'def', 'g']

次のこともできます。

x = x[:min_index] + [''.join(x[min_index:max_index])] + x[max_index:]
print(x)

>>>['a', 'b', 'c', 'def', 'g']
0
Samuel Nde