12

2 つのリストを取り、2 つのリストの違いのみを持つリストを返す関数を作成しようとしています。

例:

a = [1,2,5,7,9]
b = [1,2,4,8,9]

結果は印刷されるはずです[4,5,7,8]

これまでの機能:

def xor(list1, list2):
    list3=list1+list2
    for i in range(0, len(list3)):
        x=list3[i]
        y=i
        while y>0 and x<list3[y-1]:
            list3[y]=list3[y-1]
            y=y-1
        list3[y]=x

        last=list3[-1]
    for i in range(len(list3) -2, -1, -1):
        if last==list3[i]:
            del list3[i]
        else:
            last=list3[i]

    return list3 
print xor([1,2,5,7,8],[1,2,4,8,9])

最初の for ループはそれを並べ替え、2 番目のループは重複を削除します。問題は、結果が では [1,2,4,5,7,8,9]ない[4,5,7,8]ため、重複が完全に削除されないことですか? これを行うには何を追加できますか。特別なモジュール、.sort、set などは使用できません。基本的にループするだけです。

4

6 に答える 6

18

基本的に、ある要素が存在し、別の要素には存在しない場合、要素を新しいリストに追加します。これを実行できるコンパクトなループを次に示します。2 つのリスト ( で連結) の各要素について、どちらにlist1+list2も存在しない場合は要素を追加します。

[a for a in list1+list2 if (a not in list1) or (a not in list2)]

現在のように、要素を明示的にループすることで、より非Pythonicなコードに簡単に変換できますが、正直なところ、ポイントがわかりません(重要ではありません):

def xor(list1, list2):
    outputlist = []
    list3 = list1 + list2
    for i in range(0, len(list3)):
        if ((list3[i] not in list1) or (list3[i] not in list2)) and (list3[i] not in outputlist):
             outputlist[len(outputlist):] = [list3[i]]
    return outputlist
于 2013-05-01T04:32:08.397 に答える
17

セットを使うほうがいい

>>> a = [1,2,5,7,9]
>>> b = [1,2,4,8,9]
>>> set(a).symmetric_difference(b)
{4, 5, 7, 8}

@DSM のおかげで、より良い文は次のようになります。

>>> set(a)^set(b)

これら 2 つのステートメントは同じです。しかし、後者はより明確です。

更新: 申し訳ありませんが、最後の要件が表示されませんでした: セットを使用できません。私の知る限り、@sashkello が提供するソリューションが最適です。

于 2013-05-01T04:31:38.507 に答える
5

注:これは本当に非Pythonicであり、宿題の答えとしてのみ使用する必要があります:)

両方のリストを並べ替えた後、次の手順を実行して重複を見つけることができます。

1) A と B の先頭にイテレータを配置する

2) Aitr が Bitr より大きい場合、Bitr の値を戻りリストに配置した後、Bitr を進めます。

3) Bitr が Aitr より大きい場合は、Aitr の値を戻りリストに配置した後、Aiter を進めます。

4) 重複を見つけた場合は、Aitr と Bitr を進めます。

于 2013-05-01T04:30:23.230 に答える
1

シンプルですが、特に効率的ではありません:)

>>> a = [1,2,5,7,9]
>>> b = [1,2,4,8,9]
>>> [i for i in a+b if (a+b).count(i)==1]
[5, 7, 4, 8]

または「ただのループ」で

>>> res = []
>>> for i in a+b:
...  c = 0
...  for j in a+b:
...   if i==j:
...    c += 1
...  if c == 1:
...   res.append(i)
... 
>>> res
[5, 7, 4, 8]
于 2013-05-01T05:04:43.043 に答える