การนับจำนวนคำหลักในพจนานุกรมในไพ ธ อน


234

ฉันมีรายการคำในพจนานุกรมที่มีค่า = การซ้ำซ้อนของคำหลัก แต่ฉันต้องการรายการคำที่แตกต่างเท่านั้นดังนั้นฉันจึงต้องการนับจำนวนคำหลัก มีวิธีนับจำนวนคำหลักหรือมีวิธีอื่นที่ฉันควรค้นหาคำที่แตกต่างกันหรือไม่

คำตอบ:


410
len(yourdict.keys())

หรือเพียงแค่

len(yourdict)

หากคุณต้องการนับคำที่ไม่ซ้ำในไฟล์คุณสามารถใช้setและทำเช่นนั้นได้

len(set(open(yourdictfile).read().split()))

4
ฉันรู้ว่าโพสต์นี้เก่า แต่ฉันอยากรู้ นี่เป็นวิธีที่เร็วที่สุดหรือไม่ หรือ: มันเป็นวิธีการที่รวดเร็วพอสมควรสำหรับพจนานุกรมขนาดใหญ่หรือไม่?
theJollySin

2
ทั้งสองlen(yourdict.keys())และlen(yourdict)เป็น O (1) หลังเร็วขึ้นเล็กน้อย ดูการทดสอบของฉันด้านล่าง
Chih-Hsuan Yen

5
ฉันต้องการที่จะทราบว่าคุณสามารถไปสำหรับค่า (ฉันรู้ว่าคำถามไม่ได้ถาม) ด้วยlen(yourdict.values())
ntk4

29

จำนวนคำที่แตกต่างกัน (เช่นจำนวนรายการในพจนานุกรม) สามารถพบได้โดยใช้len()ฟังก์ชั่น

> a = {'foo':42, 'bar':69}
> len(a)
2

เพื่อให้ได้คำที่ต่างกันทั้งหมด (เช่นปุ่ม) ใช้.keys()วิธีการ

> list(a.keys())
['foo', 'bar']

5

การโทรlen()ในพจนานุกรมของคุณโดยตรงและเร็วกว่าการสร้างตัววนซ้ำd.keys()และการเรียกlen()มัน แต่ความเร็วของทั้งสองจะน้อยมากเมื่อเปรียบเทียบกับสิ่งที่โปรแกรมของคุณกำลังทำอยู่

d = {x: x**2 for x in range(1000)}

len(d)
# 1000

len(d.keys())
# 1000

%timeit len(d)
# 41.9 ns ± 0.244 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

%timeit len(d.keys())
# 83.3 ns ± 0.41 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

2

หากคำถามเกี่ยวกับการนับจำนวนคำหลักก็จะแนะนำสิ่งที่ชอบ

def countoccurrences(store, value):
    try:
        store[value] = store[value] + 1
    except KeyError as e:
        store[value] = 1
    return

ในฟังก์ชั่นหลักมีบางสิ่งที่ลูปผ่านข้อมูลและส่งผ่านค่าไปยังฟังก์ชั่น countoccurrences

if __name__ == "__main__":
    store = {}
    list = ('a', 'a', 'b', 'c', 'c')
    for data in list:
        countoccurrences(store, data)
    for k, v in store.iteritems():
        print "Key " + k + " has occurred "  + str(v) + " times"

รหัสออก

Key a has occurred 2 times
Key c has occurred 2 times
Key b has occurred 1 times

2
PEP 8 การตั้งชื่อบอกว่าแทนควรจะเป็นcountoccurrences() count_occurrences()นอกจากนี้ถ้าคุณนำเข้ามีวิธีที่ดีกว่ามากที่จะทำมันcollections.Counter from collections import Counter; store = Counter(); for data in list: store[list] += 1
เกรแฮม

0

มีการดัดแปลงบางอย่างในคำตอบที่โพสต์ภายใต้ UnderWaterKremlin เพื่อให้มันพิสูจน์ python3 ผลลัพธ์ที่น่าประหลาดใจด้านล่างเป็นคำตอบ

รายละเอียดระบบ:

  • python = 3.7.4
  • conda = 4.8.0
  • 3.6Ghz, 8 core, 16gb
import timeit

d = {x: x**2 for x in range(1000)}
#print (d)
print (len(d))
# 1000

print (len(d.keys()))
# 1000

print (timeit.timeit('len({x: x**2 for x in range(1000)})', number=100000))        # 1

print (timeit.timeit('len({x: x**2 for x in range(1000)}.keys())', number=100000)) # 2

ผลลัพธ์:

1) = 37.0100378

2) = 37.002148899999995

ดังนั้นจึงดูเหมือนว่าขณะนี้ได้เร็วกว่าเพียงแค่ใช้len(d.keys())len()

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.