Làm cách nào để đếm các giá trị duy nhất trong danh sách


127

Vì vậy, tôi đang cố gắng tạo chương trình này sẽ yêu cầu người dùng nhập và lưu trữ các giá trị trong một mảng / danh sách.
Sau đó, khi một dòng trống được nhập vào, nó sẽ cho người dùng biết có bao nhiêu giá trị trong số đó là duy nhất.
Tôi xây dựng điều này vì những lý do thực tế chứ không phải là một vấn đề đặt ra.

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

Mã của tôi như sau:

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

..và đó là tất cả những gì tôi đã nhận được cho đến nay.
Tôi không chắc làm thế nào để đếm số từ duy nhất trong một danh sách?
Nếu ai đó có thể đăng giải pháp để tôi có thể học hỏi từ nó, hoặc ít nhất là cho tôi thấy nó sẽ tuyệt vời như thế nào, cảm ơn!


4
bạn có thể sửa lỗi thụt lề trong mẫu mã của mình không, nó quan trọng trong Python!
hộp mã

1
Bạn đã xóa mã của mình thay vì chỉnh sửa để làm cho mã có thể đọc được! Có mã sẽ giúp rất nhiều ...
hcarver

1
@codebox xin lỗi sẽ làm ngay bây giờ
Joel Aqu.

Câu trả lời:


246

Ngoài ra, sử dụng collection.Counter để cấu trúc lại mã của bạ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

Đầu ra:

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

47
Không phải câu trả lời cho câu hỏi của Joel, nhưng chính xác là những gì tôi đang tìm kiếm, cảm ơn!
Huw Walters

Hoàn hảo. Và một con mắt bò. Cảm ơn @Vidul
Parag Tyagi

Counter(words).values()là tốt đẹp. Chúng ta đang giả sử số lượng theo thứ tự xuất hiện đầu tiên của danh sách các từ? Ý tôi là, tôi giả sử tính sẽ cho chúng ta những đếm một, sau đó b, sau đó c, sau đó d ...
Monica Heddneck

2
Lưu ý nếu bạn muốn trình bày điều này dưới dạng một mệnh đề như count_dict = {'a': 2, 'b': 1, 'c': 1}bạn có thể làmcount_dict = dict(Counter(words).items())
Peter

219

Bạn có thể sử dụng một tập hợp để loại bỏ các bản sao, sau đó hàm len để đếm các phần tử trong tập hợp:

len(set(new_words))


16

Sử dụng một bộ :

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

Được trang bị điều này, giải pháp của bạn có thể đơn giản như:

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
Xin giải thích thế nào điều này là khác nhau từ các câu trả lời khác
Akaisteph7

4

Đối với ndarray, có một phương thức numpy được gọi là duy nhất :

np.unique(array_name)

Ví dụ:

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

Đối với một Chuỗi có một hàm gọi value_counts () :

Series_name.value_counts()


1

Mặc dù một tập hợp là cách dễ nhất, bạn cũng có thể sử dụng một chính tả và sử dụng some_dict.has(key)để điền từ điển chỉ với các khóa và giá trị duy nhất.

Giả sử bạn đã điền đầy words[]đủ thông tin đầu vào từ người dùng, hãy tạo một chính tả ánh xạ các từ duy nhất trong danh sách thành một số:

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

Phương pháp khác bằng cách sử dụng gấu trúc

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

Sau đó, bạn có thể xuất kết quả ở bất kỳ định dạng nào bạn muốn


1

Làm thế nào về:

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

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


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

Nó trả về số lượng giá trị duy nhất trong danh sách


Chào mừng bạn đến với StackOverflow! Có vẻ như giải pháp này giả định sử dụng pandaskhuôn khổ. Sẽ tốt hơn nếu đề cập đến nó trong câu trả lời vì nó có thể không rõ ràng đối với những người dùng khác.
Sergey Shubin,

0

Những điều sau đây sẽ hoạt động. Hàm lambda lọc ra các từ trùng lặp.

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

Tôi muốn tự mình sử dụng một bộ, nhưng đây là một cách khác:

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!"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.