Liste içinde kaç liste var?

merhaba pythonda bir liste içerisinde kaç liste olduğunu nasıl öğrenebilirim

2 Beğeni
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.

4 Beğeni

Bence on numara recursive olmuş, ben beğendim mantığını, eline sağlık :+1:

2 Beğeni

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
6 Beğeni

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
ss
bu şekilde argümanın tipini size hatırlatabilir. Tabii bir noktada kodu okuyan kişiye de bir nebze kolaylık sağlıyor.

2 Beğeni

İ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
1 Beğeni

Oo ornek kod varsa calisma da var :slight_smile: :

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 :slight_smile:
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.

1 Beğeni