Bagaimana cara menghitung nilai unik di dalam daftar

127

Jadi saya mencoba membuat program ini yang akan meminta pengguna untuk memasukkan dan menyimpan nilai dalam larik / daftar.
Kemudian ketika baris kosong dimasukkan, itu akan memberi tahu pengguna berapa banyak dari nilai-nilai itu yang unik.
Saya membangun ini untuk alasan kehidupan nyata dan bukan sebagai kumpulan masalah.

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

Kode saya adalah sebagai berikut:

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

..dan hanya itu yang saya dapatkan sejauh ini.
Saya tidak yakin bagaimana cara menghitung jumlah kata unik dalam daftar?
Jika seseorang dapat memposting solusi sehingga saya dapat belajar darinya, atau setidaknya menunjukkan kepada saya bagaimana solusi itu akan bagus, terima kasih!

Joel Aqu.
sumber
4
dapatkah Anda memperbaiki lekukan dalam sampel kode Anda, ini penting dalam Python!
kode
1
Anda telah menghapus kode Anda alih-alih mengeditnya agar dapat dibaca! Memiliki kode di sana akan banyak membantu ...
hcarver
1
@codebox maaf akan dilakukan sekarang
Joel Aqu.

Jawaban:

246

Selain itu, gunakan collections.Counter untuk memfaktorkan ulang kode Anda:

from collections import Counter

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

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

Keluaran:

['a', 'c', 'b']
[2, 1, 1]
Vidul
sumber
47
Bukan jawaban atas pertanyaan Joel, tapi persis seperti yang saya cari, terima kasih!
Huw Walters
Sempurna. Dan tepat sasaran. Terima kasih @Vidul
Parag Tyagi
Counter(words).values()bagus. Kami mengasumsikan hitungannya dalam urutan kemunculan pertama daftar kata? Maksud saya, saya mengasumsikan hitungan akan memberi kita hitungan a, lalu b, lalu c, lalu d ...
Monica Heddneck
2
Perhatikan jika Anda ingin menampilkan ini sebagai perintah seperti count_dict = {'a': 2, 'b': 1, 'c': 1}yang dapat Anda lakukancount_dict = dict(Counter(words).items())
Peter
219

Anda dapat menggunakan satu set untuk menghapus duplikat, lalu fungsi len untuk menghitung elemen dalam set:

len(set(new_words))
kotak kode
sumber
37

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

James Hirschorn
sumber
16

Gunakan satu set :

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

Berbekal ini, solusi Anda bisa sesederhana:

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
sumber
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
sumber
1
Tolong jelaskan bagaimana ini berbeda dari jawaban lainnya
Akaisteph7
4

Untuk ndarray ada metode numpy yang disebut unique :

np.unique(array_name)

Contoh:

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

Untuk Seri ada panggilan fungsi value_counts () :

Series_name.value_counts()
pengguna78692
sumber
1
ipta = raw_input("Word: ") ## asks for input
words = [] ## creates list
unique_words = set(words)
pengguna1590499
sumber
1

Meskipun satu set adalah cara termudah, Anda juga dapat menggunakan dict dan menggunakan some_dict.has(key)untuk mengisi kamus hanya dengan kunci dan nilai unik.

Dengan asumsi Anda telah mengisi words[]dengan masukan dari pengguna, buat dict yang memetakan kata-kata unik dalam daftar ke angka:

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
sumber
1

Cara lain dengan menggunakan panda

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

Anda kemudian dapat mengekspor hasil dalam format apa pun yang Anda inginkan

HazimoRa3d
sumber
1

Bagaimana tentang:

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

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


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

Ini mengembalikan berapa banyak nilai unik dalam daftar

john_data
sumber
Selamat datang di StackOverflow! Sepertinya solusi ini mengasumsikan menggunakan pandaskerangka kerja. Akan lebih baik untuk menyebutkannya dalam jawaban karena mungkin tidak jelas bagi pengguna lain.
Sergey Shubin
0

Berikut ini seharusnya bekerja. Fungsi lambda menyaring kata-kata yang digandakan.

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
sumber
0

Saya akan menggunakan satu set sendiri, tetapi inilah cara lain:

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
sumber
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!"
Ingin tahu
sumber