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!

Joel Aqu.
quelle
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]
Vidul
quelle
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))
Codebox
quelle
37

values, counts = np.unique(words, return_counts=True)

James Hirschorn
quelle
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
Linus Thiel
quelle
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}
MadJayhawk
quelle
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()
user78692
quelle
1
ipta = raw_input("Word: ") ## asks for input
words = [] ## creates list
unique_words = set(words)
user1590499
quelle
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
JMB
quelle
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

HazimoRa3d
quelle
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'
John Wang
quelle
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!"
Nicola Musatti
quelle
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!"
Neugierig
quelle