Bir liste içindeki benzersiz değerleri nasıl sayarım


127

Bu yüzden, kullanıcıdan girdi isteyecek ve değerleri bir dizi / listeye depolayacak bu programı yapmaya çalışıyorum.
Ardından boş bir satır girildiğinde, kullanıcıya bu değerlerden kaçının benzersiz olduğunu söyleyecektir.
Bunu gerçek hayattaki nedenlerle oluşturuyorum, bir problem seti olarak değil.

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

Kodum aşağıdaki gibidir:

# 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:

..ve şimdiye kadar elde ettiğim tek şey bu.
Bir listedeki benzersiz kelime sayısını nasıl sayacağımdan emin değilim?
Birisi ondan bir şeyler öğrenebilmek için çözümü gönderebilirse veya en azından bana nasıl harika olacağını gösterirse, teşekkürler!


4
kod örneğinizdeki girintiyi düzeltebilir misiniz, Python'da bu önemlidir!
kod kutusu

1
Kodunuzu okunabilir hale getirmek için düzenlemek yerine kaldırdınız!
Koda

1
@codebox üzgünüm şimdi yapacak
Joel Aqu.

Yanıtlar:


246

Ayrıca , kodunuzu yeniden düzenlemek için collections.Counter kullanın:

from collections import Counter

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

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

Çıktı:

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

47
Joel'in sorusuna bir yanıt değil, tam olarak aradığım şey, teşekkürler!
Huw Walters

Mükemmel. Ve tam bir hedef. Teşekkürler @Vidul
Parag Tyagi

Counter(words).values()Güzel. Sayının kelime listesinin ilk görünüm sırasına göre olduğunu varsayıyoruz. Demek istediğim,
sayımın

3
count_dict = {'a': 2, 'b': 1, 'c': 1}Bunu yapabileceğiniz gibi bir dikte olarak göstermek isteyip istemediğinize dikkat edincount_dict = dict(Counter(words).items())
Peter

220

Yinelenenleri kaldırmak için bir küme kullanabilirsiniz ve ardından kümedeki öğeleri saymak için len işlevini kullanabilirsiniz:

len(set(new_words))


16

Bir set kullanın :

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

Bununla donanmış olarak, çözümünüz şu kadar basit olabilir:

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
Lütfen bunun diğer yanıtlardan ne kadar farklı olduğunu açıklayın
Akaisteph7

4

Ndarray için adında bir numpy yöntem yoktur benzersiz :

np.unique(array_name)

Örnekler:

>>> 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])

Bir Dizi için value_counts () işlev çağrısı vardır :

Series_name.value_counts()

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

1

Bir küme en kolay yol olsa da, bir dikt kullanabilir some_dict.has(key)ve bir sözlüğü yalnızca benzersiz anahtarlar ve değerlerle doldurmak için kullanabilirsiniz .

words[]Kullanıcıdan gelen girdiyle zaten doldurduğunuzu varsayarak , listedeki benzersiz sözcükleri bir sayıya eşleyen bir dikte oluşturun:

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

Pandaları kullanarak diğer yöntem

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"])

Daha sonra sonuçları istediğiniz formatta dışa aktarabilirsiniz


1

Peki ya:

import pandas as pd
#List with all words
words=[]

#Code for adding words
words.append('test')


#When Input equals blank:
pd.Series(words).nunique()

Bir listede kaç tane benzersiz değer olduğunu döndürür


StackOverflow'a hoş geldiniz! Görünüşe göre bu çözüm pandasçerçeve kullandığını varsayıyor . Diğer kullanıcılar için net olmayabileceği için cevapta belirtmek daha iyi olacaktır.
Sergey Shubin

0

Aşağıdakiler çalışmalıdır. Lambda işlevi yinelenen sözcükleri filtreler.

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

Kendim bir set kullanırdım ama işte başka bir yol daha:

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!"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.