0
def intercala_listas(lista1, lista2):

    l1 = ["b", "d", "f", "h"]
    l2 = ["a", "c", "e", "g"]
    assert intercala_listas(l1,l2) == ['a', 'b', 'c', 'd', 'e','f', 'g', 'h']
    assert l1 == ["b", "d", "f", "h"]
    assert l2 == ["a", "c", "e", "g"]

2 つのリストを受け取り、最初のリスト (l1) の要素を奇数インデックスに、2 番目のリスト (l2) の要素を偶数インデックスに配置する必要がある 3 番目のリストを返す intercala_lista という関数を作成する必要があります。示されているアサートのように。

完全な答えは期待していませんが、それを行う方法についてのアイデアが必要です。


私はこのようなことを試しました:

def intercala_listas(lista1, lista2):
    lista = [8]
    for i in range(len(lista)):
        if lista[i].index%2 == 0:
            lista[i] = lista1[i]
        else:
            lista[i] = lista2[i]
        return lista

この関数でインデックスを適切に使用していないことはわかっています。アイデアは大丈夫​​ですか?

4

8 に答える 8

4

ヒント: 次のzip関数を使用します。

>>> zip(l2, l1)
[('a', 'b'), ('c', 'd'), ('e', 'f'), ('g', 'h')]

あなたの答えについて: Python リストは配列ではありません。サイズは固定されていないため、要素を最後に追加するだけです。

def intercala_listas(lista1,lista2):
    # Assumes lista1 and lista2 are the same length 
    lista = []

    for i in range(len(lista1)):
        lista.append(lista1[i])
        lista.append(lista2[i])

    return lista

>>> print intercala_listas(list("aceg"), list("bdfh"))
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
于 2013-10-17T19:28:58.367 に答える
2

このzip関数は、リストをまとめて圧縮するように設計されています。2 番目のものを最初に置きたいようですが、引数を逆にするだけでそれを行うことができます。

一方、これにより、フラット化する必要がある 2 タプルのシーケンスが得られます。これを行う正しい方法は、を使用することchainです。(使用sumは誤解を招くだけでなく、二次関数的に遅くなります。)

最後に、これの最終結果は、リストではなくある種のイテラブル (実際には反復子) になるため、リストからリストを作成する必要があります。そう:

def intercala_listas(a, b):
    return list(itertools.chain.from_iterable(zip(b, a)))
于 2013-10-17T19:40:28.383 に答える
2

これは、Python のあまり知られていない機能のいくつかを示すために、オフセットとステップ サイズを指定した Python のスライス割り当てを使用したファンキーなソリューションです。ネストされたリスト内包表記またはその他のソリューションを使用しzipた方が一般的には望ましいでしょう。このソリューションでは、両方のリストの長さが同じであると想定しています。

def intersect_lists(l1, l2):
    result = [0] * len(l1) * 2 #create result list of required size
    result[::2] = l2 #assign l2 to the slice of every second item in result
    result[1::2] = l1 #as above but starting at offset 1
    return result
于 2013-10-17T19:36:23.223 に答える
2
import itertools

list(itertools.chain(*zip(l2, l1)))
# ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']

また

list(itertools.chain.from_iterable(zip(l2, l1)))
# ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
于 2016-12-05T00:06:23.713 に答える
1

短くて甘い:

list(sum(zip(l2, l1), ()))
于 2013-10-17T19:35:52.173 に答える
1

特にこの問題にを使用sum()すると、混乱を招き、遅くなる可能性があります (コメントを参照)。方法は次のとおりです。

[e for ts in zip(l2, l1) for e in ts]
于 2013-10-17T19:30:36.207 に答える