Next() fonksiyonunda sorun


#1

Merhaba.

cu =iter(['aba', 'saba', 'kaba'])
ku=['aba', 'saba', 'kaba']
#len(cu) ifadesini iterable olarak kabul etmediği için
# aynı listeyi (iter)siz olarak kopyaladım

for i in range(len(ku)):
    m=next(cu)
    print(m)
    n=next(cu)
    print(n)
    o=next(cu)
    print(o)
    p=next(cu)
    print(p)

Çıktı şöyle:

aba
saba
kaba
Traceback (most recent call last):
  File "C:/Users/Pc/Python/Python37/sil5.py", line 14, in <module>
    p=next(cu)
StopIteration

listede kaç eleman olduğunu bilmiyorsam, m,n,o,p değişkenlerinden kaç tanesini kullanacağımı da bilmiyorum. bu yüzden, len(ku) da kesileceğini varsayarak fazladan değişken kullanıyorum. for döngüsü de iterasyonu len(ku) da kesmiyor.

m=aba
n=saba
n=kaba

çıktılarını nasıl alabilirim? Amacım dinamik olarak liste elemanlarına değişken atamak. Eğer liste elemanlarına döngü ile değişken atamak istersem;

for i in ku:
    m=ku[i]
    print[m]
 m=ku[i]
TypeError: list indices must be integers or slices, not str

Bu hatayı aşamıyorum.
Yardım lütfen!


#2

Bu sorun için iter’i kullanmanıza gerek yok; şu şekilde çözebilirsiniz:

değişkenler = ['m', 'n', 'o']
sozluk = {}
for i in range(len(ku)):
    sozluk[değişkenler[i]] = ku[i]

#3

Teşekkürler hocam,

print(sozluk.values())

dict_values(['aba'])
dict_values(['aba', 'saba'])
dict_values(['aba', 'saba', 'kaba'])

sözlük değerlerine (veya anahtarlara) tek tek nasıl ulaşabilirim?

m=aba
n=saba
o=kaba

tam olarak bu eşitliğe, teker teker ihtiyacım var, döngü içinde eşitlik yazdığım zaman

keyword can not be an expression

hatası alıyorum. Belki de döngü değerlerini nasıl kullanacağımı bilmiyorum henüz. “print” edip ekranda gördükten sonra ona bir değişken atamaktan başka yol bilmiyorum. çözüm “return” kullanmaksa, burada nasıl kullanmalıyım? Yani döngüden, “n=saba” sonucunu nasıl alırım?

 print(sozluk.keys(n))
NameError: name 'n' is not defined

Yeniden teşekkürler.


#4

sözlükteki verilere ulaşmak istiyorsanız şu şekilde yapabilirsiniz düşünelim elimizde şöyle bir sözlük var

a = {"emre":5,"enes":3}

"emre"  yada "enes" anahtarındaki değere şu şekilde ulaşabiliriz 

a.get("emre")
a.get("enes")

Output;
5
3


#5

Şöyle de olur:

a['emre']
a['enes']

DokKiZFX4AA3XRc


#6

Sorunumu iyi anlatamadığım için özür dilerim. Gerçekte olay şu:

# cu[] listesi, tablo sorgusundan alınıyor
cu=['? kabak yedi', 'kim kabak yedi', 'ömer kabak yedi',
    'ömer kara kabak yedi', 'emel kabak yedi']

# cu[] içinde kaç adet eleman olacağını bilemediğim için, değişkenleri
# fazla sayıda stokluyorum.
değişkenler=['a','b','c','d','e','f','g','h','j','k','l','m']
del değişkenler[len(cu):]# değişkenleri cu[] sayısına indiriyorum

sozluk = {}
for i in range(len(cu)):
    sozluk[değişkenler[i]] = cu[i]               
# elemanları kelimelere ayırıp,     
a=set(cu[0].split())
b=set(cu[1].split())
c=set(cu[2].split())
d=set(cu[3].split())
e=set(cu[4].split())

#Yukarıdaki setleri menuel olarak oluşturdum. değişkenleri len(cu) ile
# seçemedim.

# sonra farklı kelimeleri(aslında kısa cümlelerin öznelerini) buluyorum
# ortak olan "kabak" ve "yedi" kelimelerini atıyorum

aa=set.union(a,b,c,d,e)-set.intersection(a,b,c,d,e)

# burada "?" ve "kim" kelimelerini de atıyorum
print(aa)
for i in aa:
    if i=="?" or i=="kim":
        continue
    print(i)# output: ömer, kara, emel
#sorun şu ki: set oluştururken değişkenleri "e" de kesemiyorum. len(cu) sayıda
#set oluşturmayı nasıl başarabilirim? len(cu) gelecek sorguda 5 değil 15
#veya 8 olabilir ve ben bunu bilemeyeceğim.

Derdimi kısaca anlatayım derken, hiç anlatamama riskini dikkate almıyorum anlaşılan. Tekrar özür dilerim.


#7

Burada cok daha temel bir sorun var. Degiskenler, cozume ulasirken kullandigin araçlar olmali. Sen amaçlarmış gibi anlatiyorsun.

Bir XY problemi vakasiyla karsi karsiya olabiliriz.

@ismailarilik’in gosterdigi gibi bir sozluk kullanmak, veya zaten listede olan verileri listeden kullanmak cok daha mantikli olabilir.


#8

liste içeriğini bilmiyorsam nasıl kullanabilirim açıklarmısınız?


#9

Sizin bilmenize gerek yok, programin bilmesi yetiyor?

Anlamadim.

Ama zaten sorunu da anlamadim. cu'yu aa'ya iki satir kodla cevirmek mumkun, neden degiskenlerle filan ugrasiliyor?


#10

Eğer yazdığım kodların sonundaki çıktıyı her liste için verecek o iki satır kodu yazarsanız daha kolay anlayacağım. Yeni öğrenen biri için bu emeği çok görmeyin lütfen.


#11

Yazdiginiz kodlarin sonundaki ciktiyi her liste icin verecek kod:

print("{'emel', 'kara', 'ömer', 'kim', '?'}")
print("emel\nkara\nömer")

Iki satir yazmanin emegini cok gormuyorum – hatta bu baslikta 20 dakikadan fazla harcamisimdir. Programcilik hayatiniz boyunca dogru sorulari sorabilmeniz icin gereken bilginin bir kismini veren makalenin Turkcesini buldum, linkledim. Okudunuz mu acaba?

cus = list(map(lambda x: set(x.split()), cu))
aa = set.union(*cus) - set.intersection(*cus)

#12

Çok teşekkür ederim, en pratik çözüm oldu. Ben de şunları bulmuştum:

counts = Counter(chain.from_iterable(su))
farklı = [k for k, c in counts.items() if c == 1]

#ve
for i in range(len(su) - 1):
    for j in range(i + 1, len(su)):
        intsec = set(su[i]).union(su[j])-set(su[i]).intersection(su[j])
#Bu döngü sıralı ınion ve intersect yaptığı için genelde saçmalıyor gerçi.

Düşündüklerimi kodlara dökmek için daha epeyce çalışmam gerektiği anlaşılıyor.
Yeniden teşekkürler.