0

重複の可能性:
反復中にリストを変更する

リストに複数回出現するすべてのメンバーを削除し、そのコピーを1つ残す、Pythonでコードを作成するタスクが与えられました。条件:大文字と小文字を区別しない必要があります

だから私は次のコードを書き留めました:

string = raw_input()
list1 = string.split(",")
low_case_list = list1[:] #for case-insesitive
for i in range(len(low_case_list)):
    low_case_list[i] = low_case_list[i].lower()
for member in low_case_list:
    if(low_case_list.count(member) > 1):
        del list1[low_case_list.index(member)]
        del low_case_list[low_case_list.index(member)]

入力後、次のリストを取得します:[a、b、c、d、A、B、C、D、a、b、c、d]そして操作を実行した後:[B、D、a、b 、CD]

私の質問は、メンバーを削除するときに「B」と「D」をスキップするのはなぜですか?

4

3 に答える 3

1

代わりに、次のようなものを試すことができます。

input = raw_input().split(',')
unique = set([s.lower() for s in input])
result = list(unique)
于 2012-12-18T18:28:29.447 に答える
1

すべての要素をに変換してからlistに戻すだけで、をに変換してみませんか。を使用して、すべての要素をに変換できます。setlower-caselistgeneratorlowercase

あなたはこのようにそれを行うことができます:-

>>> l = ['a', 'b', 'c', 'A', 'B', 'C', 'a', 'b', 'c']
>>> new_list = list(set(elem.lower() for elem in l))
>>> new_list
['a', 'c', 'b']

はその要素のをset維持しないため、順序が変更される可能性があることに注意してください。order

于 2012-12-18T18:28:54.720 に答える
1

これを試してみてください、簡単なはずです。あなたのリストを考えるとli

lowcase = [elem.lower() for elem in li]
output = []
for el in lowcase:
  if el not in output: output.append(el)
return output # if necessary, otherwise a simple li = output

または、より高速でエレガントな方法で、forループ全体を次のように置き換えることができます。

[output.append(el) for el in lowcase if el not in output]

要素のインデックスを参照するため、コードはバグがあるはずですが、ループ中にリストのサイズが変わるため、インデックスも変わります。

編集:セットについては考えていませんでした、明らかにここでの最良の解決策です。

于 2012-12-18T18:45:45.863 に答える