1

Python の初心者 - 誰かが私が間違っていることを教えてもらえますか?

不明な数の引数を取り、一意のリストを返す関数を作成する必要があります。例えば:

a= ['mary', 'james', 'john', 'john']
b= ['elsie', 'james', 'elsie', 'james']

unique_list(a,b)

['mary', 'james','john', 'elsie']

これは、いくつかの調査を行った後のコードの一部ですが、出力は必要なものではありません。

def unique_list:(*something)
    result1= list(something)
    result = ' '.join(sum(result1, []))
    new= []
    for name in result:
            if name not in new:
                           new.append(name)
    return new
       
>>> ユニークリスト(a,b)
['m', 'a', 'r', 'y', ' ', 'j', 'e', 's', 'o', 'h', 'n', 'l', 'i ']

これは私が疲れた別のものです:

def unique_list(*something):
    result= list(something) 
    new=[]
    for name in result:
        if name not in new:
            new.append(name)
    return new
>>> ユニークリスト(a,b)
[['メアリー', 'ジェームズ', 'ジョン', 'ジョン'], ['エルシー', 'ジェームズ', 'エルシー', 'ジェームズ']]

別のものですが、エラーメッセージが表示されました:

def single_list(*something):
    new=[]
    for name in something:
        if name not in new:
            new.append(name)
    new2= list(set(new))
    return new2
>>> single_list(a,b)
トレースバック (最新の呼び出しが最後):
  ファイル ""、1 行目、
    single_list(a,b)
  ファイル ""、6 行目、single_list 内
    new2= list(set(new))
TypeError: ハッシュできないタイプ: 'list'

何か案は?よろしくお願いいたします。

4

6 に答える 6

5

次を使用できますset

def unique_list(a, b):
    return list(set(a + b))

引数の数が不明な場合は、すべてのリストを次のように追加できますreduce

import operator
def unique_list(*args):
    return list(set(reduce(operator.add, args)))

これは以下を出力します:

>>> a= ['mary', 'james', 'john', 'john']
>>> b= ['elsie', 'james', 'elsie', 'james']
>>> unique_list(a, b)
['james', 'john', 'mary', 'elsie']
于 2012-11-06T06:07:02.117 に答える
3

不明な数の引数が必要でした:

In [73]: import itertools

In [74]: def func(*args):
    ...:     return set(itertools.chain(*args))

In [75]: func([1,2,3,4],[3,4,5],[1,2])
Out[75]: set([1, 2, 3, 4, 5])

またはitertoolsなし:

In [77]: def func2(*args):
    ...:     setlist=[set(i) for i in args]
    ...:     return set.union(*setlist)

In [78]: func2([1,2,3,4],[3,4,5],[1,2])
Out[78]: set([1, 2, 3, 4, 5])
于 2012-11-06T06:17:15.577 に答える
3

2 回目の試行では、ほぼ正解です。

実際、コードのその部分では、各リストを要素と見なしていました。おそらく、リストの各要素を検討したいと思うでしょう。したがって、コードは次のようになります。

def unique_list(*something):
    result= list(something) 
    new=[]
    for names in result:
        for name in names:
            if name not in new:
                new.append(name)
    return new

その結果、次のようになります。

['mary', 'james', 'john', 'elsie']

3 回目の試行でも同じことが機能します。その場合、リストからセットを作成し、このセットからリストを作成すると、元のリストと同じ順序で要素が返されない場合があることに注意してください。

必要に応じて、itertools.chain() を使用することもできます。関数は次のようになります。

import itertools

def unique_list(*something):
    return list(set(itertools.chain(*something)))

結果は次のようになります (セットは元の順序を保持しないことに注意してください)。

['james', 'john', 'mary', 'elsie']
于 2012-11-06T06:33:00.313 に答える
1

すべてを連結してから、この結果からlistsを作成できます。これは、関数が次のように見える任意の数の渡されたリストに対して機能しますsetlistdef unique_lists( *lists )

ret_list = []
for l in lists:
    ret_list = ret_list + l

return set( ret_list )
于 2012-11-06T06:07:38.187 に答える
1
a= ['mary', 'james', 'john', 'john']
b= ['elsie', 'james', 'elsie', 'james']
def unique_list(a, b):
    a.extend(b)
    return list(set(a))
于 2012-11-06T08:45:54.490 に答える
0

あなたが探している(私が思うに)機能は、2つのリストの組み合わせのセットを作成し、それを再度リストにすることです。そのようです:

list(set(list(a+b)))

与えます:['james', 'john', 'mary', 'elsie']

于 2012-11-06T06:07:52.663 に答える