merhaba pythonda bir liste içerisinde kaç liste olduğunu nasıl öğrenebilirim
li = [[1, 2, 3], ["a", "b", "c"], [5]]
def findNumberofList(li):
count = 0
for element in li:
if type(element) == list:
count += 1
return count
Bu şekilde listenin içindeki liste sayısını bulabilirsin. Fakat aşağıdaki gibi iç içe listeler konusunda bi algoritma oluşturamadım:
[[[1, 2, 3], [4, 5]], [6, 7]]
def total_sublists(arg: list, count=0):
prev_count = count
next_list = []
for i in arg:
if isinstance(i, list):
count += 1
next_list += [*i]
if prev_count == count:
return count
return total_sublists(next_list, count)
print(total_sublists([[1, 2, 3, [1, 2, 3, 4, [1, 2, 3, 4, 5]]], [1, 2, 3], "a", 1, 2, [1, [1, 2]]]))
>> 6
Bu şekilde, bir recursive function ile çözebildim ama umarım recursive function’ların standardına/doğasına aykırı bir şey yapmamışımdır :D
Zira Recursion’larla pek alakam olmadı şimdiye kadar.
Bence on numara recursive olmuş, ben beğendim mantığını, eline sağlık
Gayet guzel ancak soyle bir sey daha kolay olabilirdi sanki:
def total_sublists2(arg: list):
count = 0
for i in arg:
if isinstance(i, list):
count += 1
count += total_sublists2(i)
return count
hepinize teşekkür ederim emeğinize sağlık
Merhaba, buradaki : list
kısmı ne işe yarıyor ?
Sadece görüntü. Argümanın liste tipinde olduğunu söylüyor ama dediğim gibi, sadece görüntü.
def foo(arg: list):
return arg
print(foo("1"))
print(foo(1))
print(foo({"key": "value"}))
output:
1
1
{'key': 'value'}
Argümanın liste tipinde olduğunu göstersek de argüman olarak herhangi bir tipte değer girebiliriz. Ayrıca bakınız burada da benzer mantıkta çalışan bir şey var.
Üstelik bazı text editor’leri bu tip "görüntü"lerden faydalanarak
bu şekilde argümanın tipini size hatırlatabilir. Tabii bir noktada kodu okuyan kişiye de bir nebze kolaylık sağlıyor.
İlginç, ben görüntü dışında da işlevi vardır diye düşünmüştüm. Teşekkürler.
Merhaba;
Bu kodu Python’da veya başka bir dilde nasıl fonksiyonel olarak yazabiliriz? (Şart değil ama Haskell’de olursa güzel olurdu.)
def total_lists(xs):
if isinstance(xs, list):
return 1 + sum(map(total_lists, xs))
else:
return 0
total_sublists = lambda xs: total_lists(xs) - 1 if isinstance(xs, list) else 0
Haskell’de yazamazsin. (Neden?)
Pardon, dogru ya, Haskell strongly typed bir dil.
(
Prelude> [[1, 2], [1, 2]]
[[1,2],[1,2]]
Prelude> [1, [1, 2]]
<interactive>:5:1: error:
• Non type-variable argument in the constraint: Num [a]
(Use FlexibleContexts to permit this)
• When checking the inferred type
it :: forall a. (Num a, Num [a]) => [[a]]
)
Ama Telegram grubunda birisi yeni bir datatype olusturarak olabilecegini soyledi: (Yine de sayilmaz :D) (Bu arada baya ilgi cekici bir konu oldu Haskell grubunda, bakmak isteyebilirsiniz.)
data Multi a = List [a] | Str String
isList (Str _) = False
isList (List _) = True
test = [List [], List [1,2], Str "foo"]
nListInTest = length $ filter isList test
Oo ornek kod varsa calisma da var :
data Multi a = RList [Multi a] | List [a] | Str String
total_lists (Str _) = 0
total_lists (List _) = 1
total_lists (RList rs) = 1 + sum (map total_lists rs)
test = RList [RList [List [3, 4], Str "bar", RList [List [10, 20], List [30, 40]]], List [1,2], Str "foo"]
main = print $ total_lists $ test
Toplam [
sayisini buluyo diyelim
Dogru cevap icin -1’i ve baska turler icin baska implementasyonlari size kalmis.
a = Multi b
oldugu noktada ikinci case’i de bastan yazmak lazim.