Garip konumlardaki listenin elemanlarını ayıklayın


100

Bu yüzden, var olan bazı listelerin bir alt listesi olan bir liste oluşturmak istiyorum.

Örneğin,

L = [1, 2, 3, 4, 5, 6, 7]Ben alt listesini oluşturmak istediğiniz lişekilde litüm öğeleri içerir Lgarip pozisyonlarda.

Ben yapabilirken

L = [1, 2, 3, 4, 5, 6, 7]
li = []
count = 0
for i in L:
    if count % 2 == 1:
        li.append(i)
    count += 1

Ancak aynısını verimli ve daha az adımda yapmanın başka bir yolu olup olmadığını bilmek istiyorum.


@WaleedKhan: Neden bir soruda anlamaları listelemesi gerekiyor?
Tamara Wijsman

1
@TomWijsman: Anlamları listeleyin . ETA: Unutmayın: Etrafta dolaştım ve şaka yaptığınızı gösteren bu cevabınızı keşfettim . Bir dahaki sefere bir gülen surat koyun!
David Robinson

2
@DavidRobinson: Ama başkaları bunu söyleyebilir mi, iki belirsiz kelimeyle ne demek istediğini OP'nin ne anlama geldiği net olmayabilir. Sadece bazı yorumlarla arada bir bıçaklıyorum, böylece insanlar daha iyi içerik hazırlayıp daha iyi içerikler yazıyor; ve OP'den veya ziyaretçilerden habersiz ayrılmamak için ... :)
Tamara Wijsman

Yanıtlar:


230

Çözüm

Evet yapabilirsin:

l = L[1::2]

Ve hepsi bu. Sonuç, aşağıdaki konumlara yerleştirilen öğeleri içerecektir ( 0-based, yani ilk öğe konumunda 0, ikinci öğe 1vb.):

1, 3, 5

dolayısıyla sonuç (gerçek sayılar) şöyle olacaktır:

2, 4, 6

Açıklama

[1::2]Sonunda sadece liste dilimleme için bir nottur. Genellikle şu biçimdedir:

some_list[start:stop:step]

Atlarsak start, default ( 0) kullanılır. Böylece ilk öğe ( 0dizinler 0-based olduğu için konumunda) seçilecektir. Bu durumda ikinci eleman seçilecektir.

İkinci öğe atlandığı için, varsayılan (listenin sonu) kullanılmaktadır. Yani liste, ikinci elemandan sonuna kadar yineleniyor .

Ayrıca üçüncü argüman ( step) da sağladık 2. Bu, bir öğenin seçileceği, bir sonraki öğenin atlanacağı vb. Anlamına gelir ...

Özetlemek gerekirse, bu durumda şu [1::2]anlama gelir:

  1. ikinci öğeyi alın (bu arada, dizinden değerlendirirseniz, garip bir öğedir),
  2. bir öğeyi atlayın (çünkü sahip step=2olduğumuz için step=1, varsayılan olanın aksine birini atlıyoruz ),
  3. sonraki öğeyi al,
  4. 2.-3. Adımları tekrarlayın. listenin sonuna gelene kadar,

DÜZENLEME : @PreetKukreti, Python'un liste dilimleme gösterimi hakkında başka bir açıklama için bir bağlantı verdi. Buraya bakın: Python'un dilim gösterimini açıklayın

Ekstralar - sayacı değiştirme enumerate()

Kodunuzda, sayacı açıkça yaratır ve artırırsınız. Python'da bu gerekli değildir, çünkü aşağıdakileri kullanarak tekrarlanabilir bir şekilde numaralandırabilirsiniz enumerate():

for count, i in enumerate(L):
    if count % 2 == 1:
        l.append(i)

Yukarıdakiler, kullandığınız kodla tam olarak aynı amaca hizmet eder:

count = 0
for i in L:
    if count % 2 == 1:
        l.append(i)
    count += 1

forPython'da sayaç ile döngüleri taklit etme hakkında daha fazla bilgi : Python 'for' döngülerinde dizine erişme


@TomWijsman python dilimleme sözdizimini anlamak için bu soruya bakın
Preet Kukreti

Soru tuhaf pozisyonlar soruyor. Bu eşit konumlar verir (0,2,4,6); OP (1,3,5)tarafından verilecek endeksler istiyor gibi görünüyor [1,2,3,4,5,6,7][1::2].
Marcin

@Marcin: Evet, aslında aynı sonuçla çıktım (düzeltmeye bakınız). Bu, OP'nin kodunu dikkatlice okuduktan sonra çıktı. Sorun, indeksleme için farklı bir temelde sonuçlandı (benim için " tek " öğe, ilk öğe anlamına geliyordu , OP için görünüşte ikinci , yani endeksli 1).
Tadeck

1
@TomWijsman: Üzgünüm, neyi değiştirdiğinizi fark etmedim. Aslında bir bağlantı var ama bu Python'un listdilimlemesine değil Numarray projesine götürüyor . Biraz farklıdır, özellikle list'dilim orijinal listeye referans tutmadığından (Numarray'de .copy()orijinal diziye referans vermeyen bir şeyi açıkça çağırmanız gerekir ). Ancak bazı okuyucular için daha iyi olabilecek bir şeye sahip olmak güzel. Yorumda bu bağlantıya yer verebilir misiniz, böylece onu yükseltebilirim ve cevabın hemen altında görünecektir.
Tadeck

@Tadeck "Tek numaralı indeksler" oldukça doğal olarak tek sayı olan indisler anlamına gelir.
Marcin

12

İçin garip pozisyonlarda, muhtemelen istiyorum:

>>>> list_ = list(range(10))
>>>> print list_[1::2]
[1, 3, 5, 7, 9]
>>>>

3

Matematik (Küme) sözdizimi nedeniyle Liste anlamalarını seviyorum. Peki şuna ne dersin?

L = [1, 2, 3, 4, 5, 6, 7]
odd_numbers = [y for x,y in enumerate(L) if x%2 != 0]
even_numbers = [y for x,y in enumerate(L) if x%2 == 0]

Temel olarak, bir listeyi numaralandırırsanız, dizini xve değeri alırsınız y. Burada yaptığım şey, değeri yçıktı listesine (çift veya tek) koymak ve xbu noktanın tek ( x%2 != 0) olup olmadığını bulmak için dizini kullanmak .


1
Numaralandır (öğeler) yerine numaralandırılması (L) olması gerekmez mi?
ab123

0

Bitsel AND operatöründen yararlanabilirsiniz &. Aşağıya bakalım:

x = [1, 2, 3, 4, 5, 6, 7]
y = [i for i in x if i&1]
>>> 
[1, 3, 5, 7]

Bitsel AND operatörü 1 ile kullanılır ve bunun çalışmasının nedeni, ikili olarak yazıldığında tek sayının ilk basamağının 1 olması gerektiğidir.

23 = 1 * (2**4) + 0 * (2**3) + 1 * (2**2) + 1 * (2**1) + 1 * (2**0) = 10111
14 = 1 * (2**3) + 1 * (2**2) + 1 * (2**1) + 0 * (2**0) = 1110

VE 1 ile yapılan işlem yalnızca 1 döndürür (ikilik tabanda 1 de son basamak 1 olacaktır), değer tek ise.

Daha fazla bilgi için Python Bitwise Operator sayfasına bakın.

Not: Bir veri çerçevesindeki tek ve çift sütunları seçmek istiyorsanız bu yöntemi taktiksel olarak kullanabilirsiniz. Yüz anahtar noktalarının x ve y koordinatlarının x1, y1, x2, vb. Sütunlar olarak verildiğini varsayalım ... x ve y koordinatlarını her görüntünün genişlik ve yükseklik değerleri ile normalleştirmek için basitçe gerçekleştirebilirsiniz

for i in range(df.shape[1]):
    if i&1:
        df.iloc[:, i] /= heights
    else:
        df.iloc[:, i] /= widths

Bu tam olarak soruyla ilgili değildir, ancak veri bilimcileri ve bilgisayarla görme mühendisleri için bu yöntem yararlı olabilir.

Şerefe!


-1

list_ = list (range (9)) print (list_ [1 :: 2])


lütfen kısa bir açıklama ile cevaplayın ve bazı kod bloklarını düzgün şekilde biçimlendirin. Teşekkürler
venkata krishnan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.