Özet olarak, list
içinde list
ve bunun da içinde str
verisi olunca aşağıdaki fonksiyon orijinal veriyi bozmadan sonucu çıkartıyor.
#!/usr/bin/python3.8
# -*- coding: utf-8 -*-
find_max = lambda x: [
*map(
lambda m: ([[*m][0][2:-2]], m[1]), set(
filter(
lambda i: i[1] == max([j[1] for j in y]),
(y := [(str(k), 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), (['elma'], 5), (['armut'], 5)]
Ama list
içinde sadece str
varsa yukarıdaki yöntemin yerine ilk mesajımda belirttiğim yöntem kullanılabilir:
#!/usr/bin/python3.8
# -*- coding: utf-8 -*-
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})
)
)
]
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ı:
[('elma', 5), ('armut', 5), ('kiraz', 5)]
Sizin paylaştığınız kodlarda 0.
indis değerindeki elemanı sorted
yaparak alıyorsunuz, ama liste içinde "elma"
ve "kiraz"
stringleri aynı sayıda geçmişse o zaman bu yöntemi biraz değiştirmek gerekir.
Not: Bu arada Python3.8’de iyiki Walrus Operatörü özelliğini getirmişler.