1

やあみんな、これは私の最初の年のプログラミングであり、私はpythonから始めました。私はプログラミングをかなりよく理解していますが、この宿題の質問について助けが必要です。

パラメータとしてリストを使用してから、リスト内のさまざまな値の数を返す必要があります。質問のリストの例は[1, 4, 1, 7, 6, 1, 4, 3]であるため、戻り値は5になります。

今、私はそれを解決する私の方法がおそらく簡潔でもエレガントでもないことを知っていますが、誰かが私を助けて、それがうまくいくように何を変えるべきか教えてくれるなら、私はそれを大いに感謝します。

def count(mylist):
    newlist = []
    newlist.append(mylist[0])
    stor = False
    for i in mylist:
        stor = False
        for j in newlist:
            if j == i:
                stor == True
        if not stor:
            newlist.append(i)
    return newlist
4

6 に答える 6

5

set()代わりに使用してください:

def count(myList):
    return len(set(myList))

セットには各値のコピーが1つしか保持されないため、リストをセットに変換すると、すべての重複を削除するという便利な副作用があります。結果のセットの長さはあなたが探している答えです。

セットを使用するのが最も効率的な方法です。または、 dict()を使用することもできます。

def count(myList):
     return len(dict.fromkeys(myList))

これは、キーに関連付けられた値のためのスペースを予約するため、効率がわずかに低下します。

使用したいのがリストだけの場合(最も効率が悪い)、not inネガティブメンバーシップテストを使用します。

def count(myList):
    unique = []
    for item in myList:
        if item not in unique:
             unique.append(item)
    return len(unique)
于 2012-12-06T17:23:08.170 に答える
2

ここでセットを使用できます:

In [1]: lis=[1, 4, 1, 7, 6, 1, 4, 3]

In [2]: len(set(lis))
Out[2]: 5

ヘルプset

set(iterable) -> new set object
Build an unordered collection of unique elements.

forループの使用:

In [6]: def count(lis):
   ...:     mylis=[]
   ...:     for elem in lis:
   ...:         if elem not in mylis:  # append the element to
                                       # mylis only if it is not already present
   ...:             mylis.append(x)
   ...:     return len(mylis)        
   ...: 

In [7]: count(lis)
Out[7]: 5

また、を見てください。これは、要素が繰り返された回数を含む、collections.Counter()のサブクラスを返します。dict

In [10]: from collections import Counter

In [11]: c=Counter(lis)

In [12]: c
Out[12]: Counter({1: 3, 4: 2, 3: 1, 6: 1, 7: 1})

In [13]: len(c)
Out[13]: 5
于 2012-12-06T17:23:00.703 に答える
1
stor == True

あなたは実際にここに設定storしていませんTrue

于 2012-12-06T17:25:57.120 に答える
0

使用できない場合はset

def count(mylist):
    mylist.sort()
    total = 0
    for k in range(1, len(mylist) -1 ):
        if mylist[k] != mylist[k + 1]:
            total += 1
    return total

これにより、リストが並べ替えられ、要素が次の要素と等しくなくなるたびにカウンターがインクリメントされます。


並べ替えを使用できない場合は、通常、カウントされた値を追跡します。しかし、それはあまりにも明白なので、すでにカウントした値のリストを保持せずにそれを行うための面白い方法があります:

def count(mylist):
    total = 0
    for k, value in enumerate(mylist):
        total += 1 / mylist.count(value)
    return total

したがって、[1, 4, 1, 7, 6, 1, 4, 3]の場合、重みは、必要に応じ[1/3, 1/2, 1/3, 1, 1, 1/3, 1/2, 1]て合計され5ます。

これは、先生が探しているものよりもはるかに素晴らしい方法です(この方法の非効率性にもかかわらず)。

于 2012-12-06T17:24:01.643 に答える
0

ループを使用することになっている場合は、これが方法(またはそれらの1つ)です。:)

the_list = [1, 4, 1, 7, 6, 1, 4, 3]

def count(the_list):
    unique_list = []
    for item in the_list:
        if item not in unique_list:
            unique_list.append(item)
    return len(unique_list)
于 2012-12-06T17:34:39.033 に答える
0

最初は、プログラムの修正バージョン

def count(mylist):
    newlist = []
    newlist.append(mylist[0])
    stor = False
    for i in mylist:
        stor = False
        for j in newlist:
            if j == i:
                stor = True # stor == True test for equality
        if not stor:
            newlist.append(i)
    return len(newlist) # you do not want the list itself but its length

そしてここにいくつかの提案:

  • stor外側のループの外側で初期化する必要はありません。これは2行後に再度実行されます。
  • 内側のループでaを検討しbreakてください-これは物事を少しスピードアップします(不要な比較はありません)
  • newlist最初の項目を追加せずに空のリストに初期化できます。アルゴリズムは有効なままです(最初は内側のループの反復がゼロです)

ここにコード例として:

def count(mylist):
    newlist = []
    for i in mylist:
        stor = False
        for j in newlist:
            if j == i:
                stor = True
                break
        if not stor:
            newlist.append(i)
    return len(newlist)

そしてよりエレガントな(そしてpythonic):-syntaxを使用してinください;)

def count(mylist):
    newlist = []
    for i in mylist:
        if i not in newlist:
            newlist.append(i)
    return len(newlist)

にある場合、基本的item in something_iterableにtrueを返しitemますsomething_iterable。アイテムのほとんどのコレクションは反復可能です(たとえば、リスト、セット、文字列...'a' in 'abc'はtrueを返します)

そして最もpythonicな方法ですが、for / whileループはありません:

def count(mylist):
    return len(set(mylist))

説明については、他の回答を調べてください。

于 2012-12-06T17:39:40.297 に答える