Wie zähle ich eindeutige Werte in einer Liste?


126

Ich versuche also, dieses Programm zu erstellen, das den Benutzer zur Eingabe auffordert und die Werte in einem Array / einer Liste speichert.
Wenn dann eine leere Zeile eingegeben wird, wird dem Benutzer mitgeteilt, wie viele dieser Werte eindeutig sind.
Ich baue dies aus Gründen des wirklichen Lebens und nicht als Problem.

enter: happy
enter: rofl
enter: happy
enter: mpg8
enter: Cpp
enter: Cpp
enter:
There are 4 unique words!

Mein Code lautet wie folgt:

# ask for input
ipta = raw_input("Word: ")

# create list 
uniquewords = [] 
counter = 0
uniquewords.append(ipta)

a = 0   # loop thingy
# while loop to ask for input and append in list
while ipta: 
  ipta = raw_input("Word: ")
  new_words.append(input1)
  counter = counter + 1

for p in uniquewords:

..und das ist ungefähr alles, was ich bisher bekommen habe.
Ich bin nicht sicher, wie ich die eindeutige Anzahl von Wörtern in einer Liste zählen soll.
Wenn jemand die Lösung posten kann, damit ich daraus lernen kann, oder mir zumindest zeigen kann, wie großartig sie wäre, danke!


4
Könnten Sie den Einzug in Ihrem Codebeispiel korrigieren, der in Python wichtig ist?
Codebox

1
Sie haben Ihren Code entfernt, anstatt ihn zu bearbeiten, um ihn lesbar zu machen! Den Code dort zu haben wird viel helfen ...
hcarver

1
@codebox tut mir leid jetzt
Joel Aqu.

Antworten:


243

Verwenden Sie außerdem collection.Counter, um Ihren Code umzugestalten:

from collections import Counter

words = ['a', 'b', 'c', 'a']

Counter(words).keys() # equals to list(set(words))
Counter(words).values() # counts the elements' frequency

Ausgabe:

['a', 'c', 'b']
[2, 1, 1]

46
Keine Antwort auf Joels Frage, aber genau das , wonach ich gesucht habe, danke!
Huw Walters

Perfekt. Und ein Volltreffer. Danke @Vidul
Parag Tyagi

Counter(words).values()ist nett. Wir gehen davon aus, dass die Anzahl in der Reihenfolge des ersten Auftretens der Wortliste liegt. Ich meine, ich gehe davon aus, dass die Zählung uns die Zählung von a, dann b, dann c, dann d gibt ...
Monica Heddneck

219

Sie können eine Menge verwenden , um Duplikate zu entfernen, und dann die len- Funktion, um die Elemente in der Menge zu zählen:

len(set(new_words))


16

Verwenden Sie ein Set :

words = ['a', 'b', 'c', 'a']
unique_words = set(words)             # == set(['a', 'b', 'c'])
unique_word_count = len(unique_words) # == 3

Damit ausgestattet, könnte Ihre Lösung so einfach sein wie:

words = []
ipta = raw_input("Word: ")

while ipta:
  words.append(ipta)
  ipta = raw_input("Word: ")

unique_word_count = len(set(words))

print "There are %d unique words!" % unique_word_count

6
aa="XXYYYSBAA"
bb=dict(zip(list(aa),[list(aa).count(i) for i in list(aa)]))
print(bb)
# output:
# {'X': 2, 'Y': 3, 'S': 1, 'B': 1, 'A': 2}

1
Bitte erklären Sie, wie sich dies von den anderen Antworten unterscheidet
Akaisteph7

4

Für ndarray gibt es eine Numpy-Methode namens unique :

np.unique(array_name)

Beispiele:

>>> np.unique([1, 1, 2, 2, 3, 3])
array([1, 2, 3])
>>> a = np.array([[1, 1], [2, 3]])
>>> np.unique(a)
array([1, 2, 3])

Für eine Serie gibt es einen Funktionsaufruf value_counts () :

Series_name.value_counts()

1
ipta = raw_input("Word: ") ## asks for input
words = [] ## creates list
unique_words = set(words)

1

Obwohl ein Satz der einfachste Weg ist, können Sie auch ein Diktat verwenden und some_dict.has(key)ein Wörterbuch nur mit eindeutigen Schlüsseln und Werten füllen.

Angenommen, Sie haben bereits words[]Eingaben des Benutzers vorgenommen, erstellen Sie ein Diktat, das die eindeutigen Wörter in der Liste einer Zahl zuordnet:

word_map = {}
i = 1
for j in range(len(words)):
    if not word_map.has_key(words[j]):
        word_map[words[j]] = i
        i += 1                                                             
num_unique_words = len(new_map) # or num_unique_words = i, however you prefer

1

Andere Methode mit Pandas

import pandas as pd

LIST = ["a","a","c","a","a","v","d"]
counts,values = pd.Series(LIST).value_counts().values, pd.Series(LIST).value_counts().index
df_results = pd.DataFrame(list(zip(values,counts)),columns=["value","count"])

Sie können dann Ergebnisse in ein beliebiges Format exportieren


0

Folgendes sollte funktionieren. Die Lambda-Funktion filtert die duplizierten Wörter heraus.

inputs=[]
input = raw_input("Word: ").strip()
while input:
    inputs.append(input)
    input = raw_input("Word: ").strip()
uniques=reduce(lambda x,y: ((y in x) and x) or x+[y], inputs, [])
print 'There are', len(uniques), 'unique words'

0

Ich würde selbst ein Set verwenden, aber hier ist noch ein anderer Weg:

uniquewords = []
while True:
    ipta = raw_input("Word: ")
    if ipta == "":
        break
    if not ipta in uniquewords:
        uniquewords.append(ipta)
print "There are", len(uniquewords), "unique words!"

0
ipta = raw_input("Word: ") ## asks for input
words = [] ## creates list

while ipta: ## while loop to ask for input and append in list
  words.append(ipta)
  ipta = raw_input("Word: ")
  words.append(ipta)
#Create a set, sets do not have repeats
unique_words = set(words)

print "There are " +  str(len(unique_words)) + " unique words!"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.