Liste içinde en çok geçen eleman

Ah, birden fazla “maksimum” varsa hepsini mi donduruyoruz?

O zaman:

max_count = counts_sorted[0][1]
counts_max = list(itertools.takewhile(lambda c: c[1] == max_count, counts_sorted))

veya

counts_max = functools.reduce(
    lambda maxes, e: ([e] if e[1] > maxes[0][1] else maxes + [e] if e[1] == maxes[0][1] else maxes) if len(maxes) > 0 else [e],
    counts.items(),
    []
)
1 Beğeni

O zaman set()'in dışında kalan kodları sildiğimizde aşağıdaki gibi bir çıktı alırdık ve orijinal veriyi elde etmek için bu sefer başka eklemeler yapmak gerekirdi.

find_max = lambda x: set(
    filter(
        lambda i: i[1] == max([j[1] for j in y]),
        (y := [(str(k[0]), x.count(k)) for k in x])
    )
)


liste = [
    ["elma"], ["armut"], ["armut"], ["armut"], ["elma"], ["armut"],
    ["armut"], ["elma"], ["kiraz"], ["kiraz"], ["kiraz"], ["elma"],
    ["kiraz"], ["kiraz"], ["üzüm"], ["şeftali"], ["karpuz"], ["elma"]
]
  
print(find_max(liste))

Çıktı:

('kiraz', 5)

Ben burada orijinal veriyi korumak istedim. Yani çıktı şu şekilde olsun istedim:

(['kiraz'], 5)

Aslında farklı yollar denenebilir.

işime yaradı çok teşekkür ederim fakat

[['tek'], ['çift', 'mesaj']]

tek kelimeleri böyle birden fazla kelime olanlar ise böyle listeleniyor o yüzden yalnızca tek kelimeler üzerinden işlem yapabiliyorum bunu nasıl çözebilirim

birden fazla olanları birleşik yazıyor

mesaj = message.content.split(" ")

normalde böyle fakat tek kelime alıyor mesaj bunu nasıl düzeltebilirim @dildeolupbiten

Dostum gördüğün gibi farklı koşullara göre farklı algoritmalar geliştirmek lazım. Bu bahsettiğiniz örnekte dışarıdaki listenin içinde en çok geçen elemanı neye göre belirleyeceksiniz? Şöyle anlatmaya çalışayım:

["tek", ["tek"], ["tek", ["ali", "tek"]]]

Şimdi bu yukarıdaki listenin içinde hangi liste elemanının en çok geçtiğini düşündüğümüz zaman kriterimiz ne olacak?

Burada liste içinde en çok geçen eleman diye bir eleman yok aslında. Listenin elemanları şunlar:

tek  # 1. eleman
['tek']  # 2. eleman
['tek', ['ali', 'tek']]  # 3. eleman

Eğer listede en çok geçen elemanı, string ifadeye göre belirleyecekseniz, o zaman liste içindeki listeleri ortadan kaldıran bir fonksiyon yazıp sonra da açığa çıkan string verilerin hangisi listede en çok geçiyorsa onu bulan bir fonksiyonu kullanabilirsiniz.

Örnek:

find_max = lambda x: [
    *filter(
        lambda i: i, map(
            lambda j: (j, y[j]) if y[j] == max(y.values()) else [], 
            (y := {k: x.count(k) for k in x})
        )
    )
]


def unnest(x: list = []):
    result = []
    for i in x:
        if isinstance(i, list):
            result.extend(unnest(i))
        else:
            result.append(i)
    return result


liste = [[[["tek"], "tek"], ["tek", ["ali", "tek"]]], "tek"]

print(find_max(unnest(liste)))

Çıktı:

[('tek', 5)]

find_max() fonksiyonunun argümanı unnest() fonksiyonu olur, unnest() fonksiyonunun argümanı da iç içe geçmiş listeleriniz olur.

Yukarıdaki unnest() fonksiyonu [[[["tek"], "tek"], ["tek", ["ali", "tek"]]], "tek"] gibi bir veriyi ['tek', 'tek', 'tek', 'ali', 'tek', 'tek'] gibi bir veriye dönüştürür.

bende çalışmadı TeamViewer ile yapmamız mümkün mü ?

Çalışmadı mı? Nasıl bir hatayla karşılaştınız? Sanırım Walrus Operatörü yüzünden çalışmadı. Python sürümünüz 3.8 değilse hata alırsınız. Buradan çözmeye çalışalım, en son çare olarak TeamViewer’a başvururuz.

anlık bir hataymış şuan sorunsuz çalışıyor çok teşekkür ederim

1 Beğeni