Ekstrak elemen daftar pada posisi ganjil

100

Jadi saya ingin membuat list yang merupakan sublist dari beberapa list yang ada.

Sebagai contoh,

L = [1, 2, 3, 4, 5, 6, 7], Saya ingin membuat sublist liyang liberisi semua elemen di Lposisi ganjil.

Sementara saya bisa melakukannya dengan

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

Tetapi saya ingin tahu apakah ada cara lain untuk melakukan hal yang sama secara efisien dan dalam jumlah langkah yang lebih sedikit.

veepsk
sumber
@WaleedKhan: Mengapa dia perlu membuat daftar pemahaman dalam pertanyaan?
Tamara Wijsman
1
@ TomWijsman: Pemahaman daftar . ETA: Abaikan itu: Saya mencari-cari dan menemukan jawaban Anda ini yang menunjukkan Anda bercanda. Lain kali taruh wajah tersenyum!
David Robinson
2
@DavidRobinson: Tapi bisakah orang lain mengatakan itu, mungkin tidak jelas untuk OP apa yang dia maksud dengan dua kata yang ambigu. Hanya menusuk di sana-sini dengan beberapa komentar, sehingga orang bersiap-siap dan menulis konten yang lebih baik; dan untuk menghindari meninggalkan OP atau pengunjung tidak mengerti ... :)
Tamara Wijsman

Jawaban:

229

Larutan

Ya kamu bisa:

l = L[1::2]

Dan ini semuanya. Hasilnya akan berisi elemen yang ditempatkan pada posisi berikut ( 0berbasis, jadi elemen pertama ada di posisi 0, kedua di 1dll.):

1, 3, 5

jadi hasilnya (angka sebenarnya) adalah:

2, 4, 6

Penjelasan

Bagian [1::2]akhir hanyalah notasi untuk pemotongan daftar. Biasanya dalam bentuk berikut:

some_list[start:stop:step]

Jika kita menghilangkan start, default ( 0) akan digunakan. Jadi elemen pertama (pada posisi 0, karena indeks 0berbasis-) akan dipilih. Dalam hal ini elemen kedua akan dipilih.

Karena elemen kedua dihilangkan, default digunakan (akhir daftar). Jadi daftarnya sedang diulang dari elemen kedua sampai akhir .

Kami juga menyediakan argumen ketiga ( step) yaitu 2. Artinya satu elemen akan dipilih, elemen berikutnya akan dilewati, dan seterusnya ...

Jadi, secara ringkas, dalam hal ini [1::2]berarti:

  1. ambil elemen kedua (yang, omong-omong, merupakan elemen ganjil, jika Anda menilai dari indeks),
  2. lewati satu elemen (karena kita punya step=2, jadi kita melewatkan satu, sebagai kebalikan dari step=1yang default),
  3. ambil elemen selanjutnya,
  4. Ulangi langkah 2.-3. sampai akhir daftar tercapai,

EDIT : @PreetKukreti memberikan tautan untuk penjelasan lain tentang notasi pemotongan daftar Python. Lihat di sini: Jelaskan notasi irisan Python

Ekstra - mengganti penghitung dengan enumerate()

Dalam kode Anda, Anda secara eksplisit membuat dan meningkatkan penghitung. Dengan Python, hal ini tidak diperlukan, karena Anda dapat menghitung melalui beberapa iterable menggunakan enumerate():

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

Di atas memiliki tujuan yang persis sama dengan kode yang Anda gunakan:

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

Lebih lanjut tentang meniru forloop dengan penghitung dengan Python: Mengakses indeks dengan loop 'for' Python

Tadeck
sumber
@TomWijsman melihat pertanyaan ini untuk memahami sintaks pemotongan python
Preet Kukreti
Pertanyaannya menanyakan posisi ganjil. Ini memberikan posisi yang rata (0,2,4,6); sepertinya OP menginginkan indeks (1,3,5), yang akan diberikan oleh [1,2,3,4,5,6,7][1::2].
Marcin
@Marcin: Ya, saya sebenarnya keluar dengan kesimpulan yang sama (lihat koreksi). Ini keluar setelah saya membaca kode OP dengan hati-hati. Masalah ini menghasilkan basis yang berbeda untuk pengindeksan (bagi saya elemen " ganjil " berarti elemen pertama , untuk OP tampaknya itu adalah yang kedua , jadi diindeks di 1).
Tadeck
1
@TomWijsman: Maaf, saya tidak memperhatikan apa yang telah Anda ubah. Memang ada tautan, tapi mengarah ke proyek Numarray, bukan listpemotongan Python . Ini sedikit berbeda, terutama karena listslice tidak menyimpan referensi ke daftar asli (dalam Numarray Anda perlu memanggil secara eksplisit .copy()agar sesuatu yang tidak mereferensikan array asli). Tetapi menyenangkan memiliki sesuatu yang mungkin lebih baik bagi beberapa pembaca. Maukah Anda mengeposkan tautan ini di komentar, jadi saya dapat memberi suara positif dan itu akan muncul tepat di bawah jawaban?
Tadeck
@Tadeck "Indeks bernomor ganjil" secara alami berarti indeks yang merupakan angka ganjil.
Marcin
12

Untuk posisi ganjil , Anda mungkin menginginkan:

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

Saya suka pemahaman Daftar karena sintaks Matematika (Set) mereka. Jadi bagaimana dengan ini:

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]

Pada dasarnya, jika Anda menghitung daftar, Anda akan mendapatkan indeks xdan nilainya y. Apa yang saya lakukan di sini adalah memasukkan nilai yke dalam daftar keluaran (genap atau ganjil) dan menggunakan indeks xuntuk mengetahui apakah titik itu ganjil ( x%2 != 0).

peterb
sumber
1
Bukankah seharusnya enumerate (L) bukannya enumerate (items)?
ab123
0

Anda dapat menggunakan operator DAN bitwise &. Yuk simak dibawah ini:

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

Operator Bitwise AND digunakan dengan 1, dan alasan kerjanya karena, angka ganjil jika ditulis dalam biner harus memiliki digit pertama sebagai 1. Mari kita periksa

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

Operasi AND dengan 1 hanya akan menghasilkan 1 (1 dalam biner juga akan memiliki digit terakhir 1), jika nilainya ganjil.

Periksa halaman Operator Bitwise Python untuk lebih lanjut.

PS: Anda secara taktis dapat menggunakan metode ini jika Anda ingin memilih kolom ganjil dan genap dalam dataframe. Misalkan koordinat x dan y dari titik kunci wajah diberikan sebagai kolom x1, y1, x2, dll. Untuk menormalkan koordinat x dan y dengan nilai lebar dan tinggi setiap gambar, Anda cukup melakukan

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

Ini tidak sepenuhnya terkait dengan pertanyaan tetapi untuk ilmuwan data dan insinyur computer vision, metode ini dapat berguna.

Bersulang!

Suvo
sumber
-1

list_ = daftar (kisaran (9)) cetak (list_ [1 :: 2])

pengguna11855765
sumber
tolong jawab dengan penjelasan singkat dan letakkan beberapa blok kode dengan format yang benar. Terima kasih
venkata krishnan