2016-04-10 23 views
0

Bu kodu kısaca anlamanın bir yol kavrayışını kullanmanın bir yolu olup olmadığını merak ediyordum. Döngüde son ltemleri çalıştırdığım her zaman bunları kullanmaya çalıştım. Denediğim bu.python 3.x bir listeyi ekleyin ve eski listeden çıkartın

list2 = [i for i in list1 if i[0] == counter] 

Geliştirmek istediğim kod İşte.

list1 = [(1,4),(2,5),(3,6),(4,6),(5,6),(6,7),(7,5),(8,6),(9,4)] 
list2 = [] 
counter = 0 

while counter != 10: 
    for i in list1: 
     if i[0] == counter: 
      list2.append(i) 

    for j in list2: 
     if j in list1: 
      list1.remove(j) 

    counter += 1 

herhangi bir yardım

Düzenleme için teşekkür ederiz. Burada biraz daha fazla kod vermeliydim. Sayaç == i [1] olduğunda list2 tarafından doldurulacak başka bir liste olacaktır.

list1[:] = [i for i in list1 if i not in list2] 

Bilmek istediğiniz herhangi bir liste anlama kullanmanın yolu (ya da bir şey daha önce görmedim) alabilir yoktur list1 ben öğeleri kaldırmak için kullanılan döngü değiştirmek için bu liste anlama kullanmış for döngüsü listelerini bir satıra eklemek için kullanılır?

list1 = [(1,4),(2,5),(3,6),(4,6),(5,6),(6,7),(7,5),(8,6),(9,4)] 
list2 = [] 
list3 = [] 

counter = 0 

while counter != 10: 
    for i in list1: 
     if i[0] == counter: 
      list2.append(i) 

    for j in list2: 
     if j in list1: 
      list1.remove(j) 

    for x in list2: 
     if x[1] == counter: 
      list3.append(i) 

    for y in list3: 
     if y in list2: 
      list1.remove(y) 



    counter += 1 
+1

'list1' ve' list2' için beklenen sonucu gönderir misiniz? – MaxU

+0

List1 'her zaman sonunda boş bırakılmamalıdır? – schwobaseggl

+0

IMO, bunu şu şekilde yapabilirsiniz: 'list2, list1 = list1 [: 11], list1 [10:]' – MaxU

cevap

0

Bildiğim kadarıyla sadece onlar Teknik bununla gerçekleştirilebilir listesinde 2. ise listenin 1 tüm unsurları kaldırmaya çalışırken Ardından listeye 2. içine listesinin 1 elemanlarını kopyalıyorsun söyleyebilirim Aşağıdaki

list1 = [(1,4),(2,5),(3,6),(4,6),(5,6),(6,7),(7,5),(8,6),(9,4)] 
list2 = list1 
list1 = [] 

Ancak sorunuzun özünde. Listenizde kullandığınız if ifadesi iyi, ancak sayacın değeri hiçbir zaman artar, bu yüzden her zaman doğru olmamışsa i[0] == 0 testini gerçekleştirdiniz.

sadece liste comprehensions muhtemelen

list1 = [(1,4),(2,5),(3,6),(4,6),(5,6),(6,7),(7,5),(8,6),(9,4)] 
list2 = [list1[i] for i in range(len(list1))] 
list1 = [val for val in list2 if val not in list1] 

ilk liste anlama izleyen bir sayaç kullanmaya benzer ile yapılabilir gerçekleştirmek için çalışıyorlardı sonra ne nasıl davrandığı hakkında bilgi çalışıyorsanız. İkincisi, her döngü için bir koşulu olan ve birinciden daha pythonic olan. Bu kod için niyetinizin tam olarak ne olduğundan emin değilsiniz, ancak bunun yardımcı olacağını umuyoruz.

+0

bunu hiç yapmamalısınız 'list2 = [list1 [i] ...]' liste listesi 'list2 = list1' eşdeğerdir ve bir şeyleri filtrelemeniz gerekse bile' list1 = [list1'deki el için el varsa…] ' –

0

bu bir deneyin: Eğer liste ekleme yerine yenisiyle olduğu liste anlamada + = yerine of = kullanırsanız

list1 = [(1,4),(2,5),(3,6),(4,6),(5,6),(6,7),(7,5),(8,6),(9,4)] 
list2 = [] 
counter = 0 

for counter, (x, y) in list(enumerate(list1)): 
    list2.append((x, y)) 
    list1.remove((x, y)) 
+0

ick neden yapmalı? 'list.remove' çok pahalıdır, 'sayaç' asla kullanılmaz ve listelemek için numaralandırmanız gerekmez (...). –

+1

Kesin başlangıç ​​durumunu, istenildiği gibi kısaltmaya çalıştım. Sorulduktan birkaç saniye sonra yaptım ve optimizasyon aramıyordum. Haklısın, ama neden bu. – Zorgmorduk

0

Tamam Sorumun için cevabını buldum. Sadece okuduğunuzu anlatmadan önce listeyi ilan ederseniz çalışır. Cevaplar için herkese teşekkür ederim.

list1 = [(1,4),(2,5),(3,6),(4,6),(5,6),(6,7),(7,5),(8,6),(9,4)] 
list2 = [] 
list3 = [] 

counter = 0 

while counter != 10: 
    list2 += [n for n in list1 if n[0] == counter] 

    list1 = [i for i in list1 if i not in list2] 

    list3 += [j for j in list2 if j[1] == counter] 

    list2 = [n for n in list2 if n not in list2] 

counter += 1 
+0

Bunun için daha iyi bir algoritma var eminim. List1 'i sırayla ilk listeye göre sıralayabilir, artırır ve sayaçla eşleştiğinde açılan öğeyi ekleyebilir misiniz? –

+0

artı what is what is whats here2 list2 = [n list2 içinde n için n? –

0

ı bulabilmesi Bunu yapmanın en ölçülebilir şekilde bir liste anlama gerçekten tercih edilmez Bu durumda

list1.sort(lambda t: t[0], reverse=True) 
list2 = [] 

for i in range(10): 
    while list1[-1][0] == i: 
     # grab all the items from list1 where x == i (in tuples (x, y)) 
     list2.append(list1.pop()) 

olduğunu.

İlgili konular