ค้นหาองค์ประกอบที่พบบ่อยที่สุดในรายการ


174

วิธีที่มีประสิทธิภาพในการค้นหาองค์ประกอบที่พบบ่อยที่สุดในรายการ Python คืออะไร?

รายการของฉันอาจไม่ถูกแฮชดังนั้นจึงไม่สามารถใช้พจนานุกรมได้ นอกจากนี้ในกรณีที่ดึงรายการที่มีดัชนีต่ำสุดควรจะกลับมา ตัวอย่าง:

>>> most_common(['duck', 'duck', 'goose'])
'duck'
>>> most_common(['goose', 'duck', 'duck', 'goose'])
'goose'

2
หากรายการในรายการไม่แฮชคุณจะทราบได้อย่างไรว่ารายการนั้น 'เท่ากัน' การสูญเสียประสิทธิภาพในการกำหนดความเท่าเทียมกันสำหรับรายการที่ไม่สามารถแฮชอาจทำให้ประสิทธิภาพที่คุณคาดหวังได้รับจากอัลกอริทึมที่ดี :)
HS

3
ผมคิดว่าเขาหมายความว่ารายการที่อาจจะไม่แน่นอนจึงไม่มีสิทธิ์ที่จะเป็นคีย์ใน HashMap แล้ว ...
Fortran

1
ใช่นั่นคือสิ่งที่ฉันหมายถึง - บางครั้งมันจะมีรายการ
hoju


ทางที่ดีที่สุดstackoverflow.com/a/50227350/7918560
BreakBadSP

คำตอบ:


96

ด้วยโซลูชั่นมากมายที่นำเสนอฉันประหลาดใจที่ไม่มีใครเสนอสิ่งที่ฉันต้องการพิจารณาเห็นได้ชัด (สำหรับองค์ประกอบที่ไม่ใช่ hashable แต่เทียบเคียง) - [ itertools.groupby] [1] itertoolsนำเสนอฟังก์ชั่นที่รวดเร็วใช้ซ้ำได้และให้คุณมอบหมายตรรกะที่ยุ่งยากบางอย่างให้กับส่วนประกอบไลบรารีมาตรฐานที่ผ่านการทดสอบ ลองพิจารณาตัวอย่าง:

import itertools
import operator

def most_common(L):
  # get an iterable of (item, iterable) pairs
  SL = sorted((x, i) for i, x in enumerate(L))
  # print 'SL:', SL
  groups = itertools.groupby(SL, key=operator.itemgetter(0))
  # auxiliary function to get "quality" for an item
  def _auxfun(g):
    item, iterable = g
    count = 0
    min_index = len(L)
    for _, where in iterable:
      count += 1
      min_index = min(min_index, where)
    # print 'item %r, count %r, minind %r' % (item, count, min_index)
    return count, -min_index
  # pick the highest-count/earliest item
  return max(groups, key=_auxfun)[0]

แน่นอนว่านี่อาจจะเขียนสั้นกระชับกว่า แต่ฉันตั้งใจจะให้ความชัดเจนสูงสุด ข้อความทั้งสองprintสามารถไม่แสดงข้อคิดเห็นเพื่อให้เห็นเครื่องจักรทำงานได้ดีขึ้น ตัวอย่างเช่นด้วยการพิมพ์ไม่ใส่เครื่องหมายข้อคิดเห็น:

print most_common(['goose', 'duck', 'duck', 'goose'])

ส่งเสียง:

SL: [('duck', 1), ('duck', 2), ('goose', 0), ('goose', 3)]
item 'duck', count 2, minind 1
item 'goose', count 2, minind 0
goose

ดังที่คุณเห็นSLเป็นรายการของคู่แต่ละรายการตามด้วยดัชนีของรายการในรายการเดิม (เพื่อใช้เงื่อนไขหลักที่ว่าหากรายการ "ทั่วไป" ที่มีจำนวนสูงสุดเท่ากันคือ> 1 ผลลัพธ์จะต้อง จะเกิดขึ้นเร็วที่สุด)

groupbyจัดกลุ่มตามรายการเท่านั้น (ผ่านoperator.itemgetter) ฟังก์ชั่นเสริมเรียกหนึ่งครั้งต่อการจัดกลุ่มในระหว่างการmaxคำนวณรับและปลดกลุ่มภายใน - สิ่งอันดับสองรายการ(item, iterable)ที่รายการของ iterable นั้นยังเป็นสิ่งอันดับสองรายการ(item, original index)[[รายการของSL]]

จากนั้นฟังก์ชั่นเสริมจะใช้ลูปเพื่อกำหนดทั้งจำนวนของรายการในการทำซ้ำของกลุ่มและดัชนีดั้งเดิมขั้นต่ำ มันจะส่งกลับค่าเหล่านั้นว่าเป็น "คีย์คุณภาพ" ที่รวมกันซึ่งมีการเปลี่ยนแปลงเครื่องหมายดัชนีขั้นต่ำดังนั้นการmaxดำเนินการจะพิจารณารายการเหล่านั้น "ดีกว่า" ที่เกิดขึ้นก่อนหน้านี้ในรายการเดิม

รหัสนี้อาจจะง่ายมากถ้ามันกังวลเล็ก ๆ น้อย ๆน้อยเกี่ยวกับปัญหาใหญ่-O ในเวลาและพื้นที่เช่น ...

def most_common(L):
  groups = itertools.groupby(sorted(L))
  def _auxfun((item, iterable)):
    return len(list(iterable)), -L.index(item)
  return max(groups, key=_auxfun)[0]

แนวคิดพื้นฐานที่เหมือนกันเพียงแค่แสดงอย่างเรียบง่ายและกะทัดรัดมากขึ้น ... แต่อนิจจาพื้นที่เสริม O (N) พิเศษ (เพื่อรวบรวมรายการที่น่าสนใจของกลุ่ม) และเวลา O (N กำลังสอง) (เพื่อรับL.indexทุกรายการ) . ในขณะที่การออปติไมซ์ก่อนวัยอันควรเป็นรากของความชั่วร้ายทั้งหมดในการเขียนโปรแกรมจงใจเลือกวิธี O (N กำลังสอง) เมื่อ O (N log N) หนึ่งใช้ได้พร้อมใช้งานมากเกินไปต่อการขยายขีดความสามารถ! -)

ในที่สุดสำหรับผู้ที่ต้องการ "oneliners" เพื่อความชัดเจนและประสิทธิภาพรุ่นโบนัส 1 ซับที่มีชื่อ mangled เหมาะสม :-)

from itertools import groupby as g
def most_common_oneliner(L):
  return max(g(sorted(L)), key=lambda(x, v):(len(list(v)),-L.index(x)))[0]

3
สิ่งนี้จะแบ่งเป็น Python3 หากรายการของคุณมีหลายประเภท
AlexLordThorsen

2
groupbyต้องเรียงลำดับก่อน (O (NlogN)); ใช้ a Counter()กับmost_common()สามารถเอาชนะได้เพราะใช้ heapq เพื่อค้นหารายการความถี่สูงสุด (สำหรับเพียง 1 รายการนั่นคือเวลา O (N)) เนื่องจากCounter()ตอนนี้ได้รับการปรับให้เหมาะสมอย่างมาก (การนับจะเกิดขึ้นในวงวน C) จึงสามารถเอาชนะโซลูชันนี้ได้อย่างง่ายดายแม้สำหรับรายการขนาดเล็ก มันพัดมันออกมาจากน้ำสำหรับรายการขนาดใหญ่
Martijn Pieters

ข้อกำหนด 'ดัชนีต่ำสุด' สำหรับความสัมพันธ์เท่านั้นทำให้นี่เป็นโซลูชันที่ถูกต้องสำหรับปัญหานี้ สำหรับกรณีทั่วไปมากขึ้นคุณควรใช้วิธีการนับ
Martijn Pieters

@MartijnPieters บางทีคุณอาจพลาดคำถามที่กล่าวไปแล้วว่ารายการนั้นอาจไม่สามารถใช้ได้
Wim

@ ถูกต้องและหากรายการนั้นไม่สามารถล้างได้ ซึ่งทำให้คะแนนในชุดและวิธีการสูงสุดทั้งหมดไม่ลงรอยกันมากขึ้น
Martijn Pieters

442

ซับง่าย:

def most_common(lst):
    return max(set(lst), key=lst.count)

24
OP ระบุว่า[.. ] ในกรณีที่ดึงรายการที่มีดัชนีต่ำสุดควรส่งคืน โดยทั่วไปรหัสนี้จะไม่ตรงตามข้อกำหนดดังกล่าว
Stephan202

2
นอกจากนี้ OP ยังระบุด้วยว่าองค์ประกอบต่างๆต้อง hashable: ชุดต้องมีวัตถุที่สับได้
Eric O Lebigot

2
นอกจากนี้วิธีนี้คืออัลกอริทึมช้า (สำหรับองค์ประกอบในแต่ละset(lst)รายการทั้งหมดจะต้องมีการตรวจสอบอีกครั้ง) ... น่าจะเร็วพอสำหรับการใช้งานมากที่สุด แต่ ...
เอริคโอ Lebigot

9
คุณสามารถแทนที่set(lst)ด้วยlstและมันจะทำงานกับองค์ประกอบที่ไม่แฮชเกินไป; แม้ว่าช้าลง
newacct

24
สิ่งนี้อาจดูน่าสนใจ แต่จากมุมมองอัลกอริทึมนี่เป็นคำแนะนำที่แย่มาก list.count()ต้องสำรวจรายการทั้งหมดและคุณทำเช่นนั้นสำหรับรายการที่ไม่ซ้ำกันทุกรายการในรายการ สิ่งนี้ทำให้โซลูชัน O (NK) (O (N ^ 2) ในกรณีที่แย่ที่สุด) ใช้Counter()เพียงใช้เวลา O (N)!
Martijn Pieters

185

กู้ยืมเงินจาก ที่นี่สามารถใช้กับ Python 2.7:

from collections import Counter

def Most_Common(lst):
    data = Counter(lst)
    return data.most_common(1)[0][0]

ทำงานได้เร็วกว่าโซลูชั่นของอเล็กซ์ประมาณ 4-6 เท่าและเร็วกว่าซับในที่เสนอโดย newacct 50 เท่า

เมื่อต้องการดึงองค์ประกอบที่เกิดขึ้นเป็นอันดับแรกในรายการในกรณีที่มีความสัมพันธ์:

def most_common(lst):
    data = Counter(lst)
    return max(lst, key=data.get)

3
สิ่งนี้อาจมีประโยชน์สำหรับบางคน แต่ ... น่าเสียดายที่ Counter เป็นคลาสย่อย dict และ OP บอกว่าเขาไม่สามารถใช้พจนานุกรม (เนื่องจากรายการอาจไม่สามารถแฮช
Danimal

13
รักสิ่งนี้. ซับหนึ่งโดย @newacct ด้านบนอาจจะง่าย แต่ก็ทำงานใน O (n ^ 2); นั่นคือโดยที่ n คือความยาวของรายการ วิธีนี้คือ O (n)
BoltzmannBrain

5
ชอบความเรียบง่ายและความเร็ว ... อาจไม่เหมาะกับ OP แต่เหมาะกับฉันมาก!
Thom

ไม่ส่งคืนรายการที่มีการจัดทำดัชนีต่ำสุด most_common ส่งคืนรายการที่ไม่ได้เรียงลำดับและ grabbing (1) จะส่งคืนสิ่งที่ต้องการ
AgentBawls

@AgentBawls: most_commonถูกเรียงลำดับตามจำนวนไม่ใช่เรียงลำดับ ที่กล่าวว่าจะไม่เลือกองค์ประกอบแรกในกรณีของความสัมพันธ์ ฉันได้เพิ่มอีกวิธีในการใช้ตัวนับที่เลือกองค์ประกอบแรก
user2357112 รองรับ Monica

58

สิ่งที่คุณต้องการเป็นที่รู้จักกันในสถิติในโหมดและแน่นอนว่า Python มีฟังก์ชั่นในตัวเพื่อให้คุณ:

>>> from statistics import mode
>>> mode([1, 2, 2, 3, 3, 3, 3, 3, 4, 5, 6, 6, 6])
3

โปรดทราบว่าหากไม่มี "องค์ประกอบที่พบบ่อยที่สุด" เช่นกรณีที่มีการเชื่อมโยงสองอันดับแรกสิ่งนี้จะเพิ่มStatisticsErrorเนื่องจากการพูดทางสถิติจะไม่มีโหมดในกรณีนี้


8
สิ่งนี้ไม่เป็นไปตามข้อกำหนดของ OP ว่าจะให้ส่งคืนอย่างไรเมื่อมีค่าทั่วไปมากกว่าหนึ่งค่า - สถิติสถิติเกิดข้อผิดพลาดขึ้น
Keith Hall

5
อ๊ะพลาดข้อกำหนดเมื่ออ่านมัน ฉันยังเชื่อว่าคำตอบนี้มีคุณค่าแม้ว่าจะไม่มีใครแนะนำในคำถามนี้และเป็นวิธีแก้ปัญหาที่ดีสำหรับผู้ที่มีข้อกำหนดที่ จำกัด น้อยที่สุด นี่คือหนึ่งในผลลัพธ์ยอดนิยมสำหรับ "รายการที่พบบ่อยที่สุดในรายการงูใหญ่"
Luiz Berti

1
ในกรณีนั้นใช้ฟังก์ชั่นโหมดใน DataFrames แพนด้า
Elmex80s

1
โหวตขึ้นอันนี้ควรจะสูงกว่า และมันก็ไม่ใช่เรื่องยากที่จะสนองความต้องการของ OP ด้วยการลองง่ายๆยกเว้น (ดูstackoverflow.com/a/52952300/6646912ของฉัน)
krassowski

1
@BreakBadSP ใช้คำตอบของคุณหน่วยความจำมากขึ้นเพราะเพิ่มเติมและเป็นเหตุผลset O(n^3)
Luiz Berti

9

หากพวกเขาไม่แฮชคุณสามารถจัดเรียงพวกเขาและทำวนรอบเดียวกับผลการนับรายการ (รายการที่เหมือนกันจะอยู่ติดกัน) แต่มันอาจจะเร็วกว่าที่จะทำให้พวกเขา hashable และใช้ dict

def most_common(lst):
    cur_length = 0
    max_length = 0
    cur_i = 0
    max_i = 0
    cur_item = None
    max_item = None
    for i, item in sorted(enumerate(lst), key=lambda x: x[1]):
        if cur_item is None or cur_item != item:
            if cur_length > max_length or (cur_length == max_length and cur_i < max_i):
                max_length = cur_length
                max_i = cur_i
                max_item = cur_item
            cur_length = 1
            cur_i = i
            cur_item = item
        else:
            cur_length += 1
    if cur_length > max_length or (cur_length == max_length and cur_i < max_i):
        return cur_item
    return max_item

นี่เป็นวิธีที่ง่ายกว่าideone.com/Nq81vfเปรียบเทียบกับCounter()โซลูชันของ Alex
Miguel

6

นี่เป็นวิธีการแก้ปัญหา O (n)

mydict   = {}
cnt, itm = 0, ''
for item in reversed(lst):
     mydict[item] = mydict.get(item, 0) + 1
     if mydict[item] >= cnt :
         cnt, itm = mydict[item], item

print itm

(กลับรายการใช้เพื่อให้แน่ใจว่าจะส่งคืนรายการดัชนีต่ำสุด)


6

หากไม่มีข้อกำหนดเกี่ยวกับดัชนีต่ำสุดคุณสามารถใช้collections.Counterสิ่งนี้:

from collections import Counter

a = [1936, 2401, 2916, 4761, 9216, 9216, 9604, 9801] 

c = Counter(a)

print(c.most_common(1)) # the one most common element... 2 would mean the 2 most common
[(9216, 2)] # a set containing the element, and it's count in 'a'

ง่ายและรวดเร็ว คุณเจ้าพ่อของฉัน😏✌
chainstair

1
คำตอบนี้ต้องการ upvotes มากขึ้นเพราะมันอยู่ที่งานทั่วไปของการนับองค์ประกอบที่เกิดขึ้นในรายการโดยใช้โมดูลมาตรฐานและรหัส 2 บรรทัด
pcko1

5

เรียงลำดับสำเนาของรายการและค้นหาระยะยาวที่สุด คุณสามารถตกแต่งรายการก่อนที่จะเรียงลำดับด้วยดัชนีของแต่ละองค์ประกอบแล้วเลือกการเรียกใช้ที่เริ่มต้นด้วยดัชนีต่ำสุดในกรณีของการผูก


รายการอาจไม่สามารถเทียบเคียง
Pawel Furmaniak


3
# use Decorate, Sort, Undecorate to solve the problem

def most_common(iterable):
    # Make a list with tuples: (item, index)
    # The index will be used later to break ties for most common item.
    lst = [(x, i) for i, x in enumerate(iterable)]
    lst.sort()

    # lst_final will also be a list of tuples: (count, index, item)
    # Sorting on this list will find us the most common item, and the index
    # will break ties so the one listed first wins.  Count is negative so
    # largest count will have lowest value and sort first.
    lst_final = []

    # Get an iterator for our new list...
    itr = iter(lst)

    # ...and pop the first tuple off.  Setup current state vars for loop.
    count = 1
    tup = next(itr)
    x_cur, i_cur = tup

    # Loop over sorted list of tuples, counting occurrences of item.
    for tup in itr:
        # Same item again?
        if x_cur == tup[0]:
            # Yes, same item; increment count
            count += 1
        else:
            # No, new item, so write previous current item to lst_final...
            t = (-count, i_cur, x_cur)
            lst_final.append(t)
            # ...and reset current state vars for loop.
            x_cur, i_cur = tup
            count = 1

    # Write final item after loop ends
    t = (-count, i_cur, x_cur)
    lst_final.append(t)

    lst_final.sort()
    answer = lst_final[0][2]

    return answer

print most_common(['x', 'e', 'a', 'e', 'a', 'e', 'e']) # prints 'e'
print most_common(['goose', 'duck', 'duck', 'goose']) # prints 'goose'

3

วิธีแก้ปัญหาหนึ่งบรรทัดอย่างง่าย

moc= max([(lst.count(chr),chr) for chr in set(lst)])

มันจะคืนองค์ประกอบที่พบบ่อยที่สุดด้วยความถี่ของมัน


2

คุณอาจไม่ต้องการสิ่งนี้อีกต่อไป แต่นี่คือสิ่งที่ฉันทำเพื่อปัญหาที่คล้ายกัน (ดูนานกว่าที่เป็นเพราะความคิดเห็น)

itemList = ['hi', 'hi', 'hello', 'bye']

counter = {}
maxItemCount = 0
for item in itemList:
    try:
        # Referencing this will cause a KeyError exception
        # if it doesn't already exist
        counter[item]
        # ... meaning if we get this far it didn't happen so
        # we'll increment
        counter[item] += 1
    except KeyError:
        # If we got a KeyError we need to create the
        # dictionary key
        counter[item] = 1

    # Keep overwriting maxItemCount with the latest number,
    # if it's higher than the existing itemCount
    if counter[item] > maxItemCount:
        maxItemCount = counter[item]
        mostPopularItem = item

print mostPopularItem

1
คุณสามารถใช้ตัวนับ [รายการ] = ตัวนับรับ (รายการ, 0) + 1 เพื่อแทนที่ส่วนลอง / ยกเว้น
XueYu

1

การสร้างคำตอบของ Luizแต่เป็นไปตามเงื่อนไข " ในกรณีที่ดึงรายการที่มีดัชนีต่ำสุดควรส่งคืน "

from statistics import mode, StatisticsError

def most_common(l):
    try:
        return mode(l)
    except StatisticsError as e:
        # will only return the first element if no unique mode found
        if 'no unique mode' in e.args[0]:
            return l[0]
        # this is for "StatisticsError: no mode for empty data"
        # after calling mode([])
        raise

ตัวอย่าง:

>>> most_common(['a', 'b', 'b'])
'b'
>>> most_common([1, 2])
1
>>> most_common([])
StatisticsError: no mode for empty data

0

ที่นี่:

def most_common(l):
    max = 0
    maxitem = None
    for x in set(l):
        count =  l.count(x)
        if count > max:
            max = count
            maxitem = x
    return maxitem

ฉันรู้สึกคลุมเครือว่ามีวิธีการบางอย่างในห้องสมุดมาตรฐานที่จะให้คุณนับองค์ประกอบแต่ละรายการ แต่ฉันหามันไม่พบ


3
'max' เป็นวิธีการหนึ่ง คุณจะเปลี่ยนชื่อของตัวแปรหรือไม่?
Pratik Deoghare

1
โปรดทราบว่า set () ยังต้องใช้รายการที่ลบได้ด้วยซึ่งโซลูชันจะไม่ทำงานในกรณีนี้
LukášLalinský

เดี๋ยวก่อนฉันพลาดส่วนที่ไม่ถูกแฮช แต่ถ้าวัตถุนั้นมีความเท่าเทียมกันมันควรจะทำให้ง่ายต่อการแฮช
Lennart Regebro

0

นี่เป็นวิธีแก้ปัญหาช้าอย่างเห็นได้ชัด (O (n ^ 2)) หากไม่มีการเรียงลำดับและการแปลงแป้นพิมพ์เป็นไปได้ แต่มีการเปรียบเทียบความเท่าเทียมกัน ( ==):

def most_common(items):
  if not items:
    raise ValueError
  fitems = [] 
  best_idx = 0
  for item in items:   
    item_missing = True
    i = 0
    for fitem in fitems:  
      if fitem[0] == item:
        fitem[1] += 1
        d = fitem[1] - fitems[best_idx][1]
        if d > 0 or (d == 0 and fitems[best_idx][2] > fitem[2]):
          best_idx = i
        item_missing = False
        break
      i += 1
    if item_missing:
      fitems.append([item, 1, i])
  return items[best_idx]

แต่การทำให้รายการของคุณแฮชหรือจัดเรียงได้ (ตามคำแนะนำอื่น ๆ ) จะทำให้การค้นหาองค์ประกอบที่พบบ่อยที่สุดเร็วขึ้นหากความยาวของรายการของคุณ (n) มีขนาดใหญ่ O (n) โดยเฉลี่ยด้วยการแฮ็กและ O (n * log (n)) ที่แย่ที่สุดสำหรับการเรียงลำดับ


สำหรับผู้ลงคะแนนเสียง: เกิดอะไรขึ้นกับคำตอบนี้ คำตอบอื่นใดให้วิธีการแก้ปัญหาเมื่อเรียงลำดับหรือ hashing เป็นไปไม่ได้?
คะแนน

0
>>> li  = ['goose', 'duck', 'duck']

>>> def foo(li):
         st = set(li)
         mx = -1
         for each in st:
             temp = li.count(each):
             if mx < temp:
                 mx = temp 
                 h = each 
         return h

>>> foo(li)
'duck'

สิ่งนี้มีลักษณะการทำงานที่แย่มากเมื่อ n มีขนาดใหญ่และจำนวนองค์ประกอบที่ไม่ซ้ำกันก็มีขนาดใหญ่เช่นกัน: O (n) สำหรับการแปลงเป็นชุดและ O (m * n) = O (n ^ 2) สำหรับการนับ (โดย m คือจำนวนของที่ไม่ซ้ำกัน) การเรียงและการเดินคือ O (n log n) สำหรับการเรียงและ 0 (n) สำหรับการเดิน
jmucchiello

1
ใช่คุณพูดถูก ตอนนี้ฉันรู้แล้วว่านี่เป็นทางออกที่น่ากลัวและทำไม ขอบคุณสำหรับความคิดเห็น !! :-)
Pratik Deoghare

0

ฉันต้องการทำสิ่งนี้ในโปรแกรมล่าสุด ฉันจะยอมรับมันฉันไม่เข้าใจคำตอบของอเล็กซ์ดังนั้นนี่คือสิ่งที่ฉันจะลงเอยด้วย

def mostPopular(l):
    mpEl=None
    mpIndex=0
    mpCount=0
    curEl=None
    curCount=0
    for i, el in sorted(enumerate(l), key=lambda x: (x[1], x[0]), reverse=True):
        curCount=curCount+1 if el==curEl else 1
        curEl=el
        if curCount>mpCount \
        or (curCount==mpCount and i<mpIndex):
            mpEl=curEl
            mpIndex=i
            mpCount=curCount
    return mpEl, mpCount, mpIndex

ฉันหมดเวลากับวิธีแก้ปัญหาของ Alex และเร็วขึ้นประมาณ 10-15% สำหรับรายการสั้น ๆ แต่เมื่อคุณไปมากกว่า 100 รายการหรือมากกว่า (ทดสอบถึง 200,000) มันช้ากว่าประมาณ 20%


-1

สวัสดีนี่เป็นวิธีแก้ปัญหาที่ง่ายมากที่มี O ขนาดใหญ่ (n)

L = [1, 4, 7, 5, 5, 4, 5]

def mode_f(L):
# your code here
    counter = 0
    number = L[0]
    for i in L:
        amount_times = L.count(i)
        if amount_times > counter:
            counter = amount_times
            number = i

    return number

โดยที่หมายเลของค์ประกอบในรายการที่ทำซ้ำเกือบตลอดเวลา


-2
def mostCommonElement(list):
  count = {} // dict holder
  max = 0 // keep track of the count by key
  result = None // holder when count is greater than max
  for i in list:
    if i not in count:
      count[i] = 1
    else:
      count[i] += 1
    if count[i] > max:
      max = count[i]
      result = i
  return result

MostCommonElement (["a", "b", "a", "c"]) -> "a"


คำตอบอื่น ๆ ทั้งหมด คุณต้องการให้ฉันเชื่อมโยงพวกเขา?
12 รูปสี่เหลี่ยมขนมเปียกปูนในกริดที่ไม่มีมุม

-3
 def most_common(lst):
    if max([lst.count(i)for i in lst]) == 1:
        return False
    else:
        return max(set(lst), key=lst.count)

6
โปรดให้ข้อมูลเกี่ยวกับรหัสของคุณเพียงแค่โพสต์รหัสไม่ใช่คำตอบที่สมบูรณ์
jhhoff02

1
มีเหตุผลที่ใครบางคนควรใช้คำตอบนี้มากกว่า 15 คำตอบ?
คนงานทุกคนสำคัญเมื่อ

-5
def popular(L):
C={}
for a in L:
    C[a]=L.count(a)
for b in C.keys():
    if C[b]==max(C.values()):
        return b
L=[2,3,5,3,6,3,6,3,6,3,7,467,4,7,4]
print popular(L)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.