Bagaimana cara mengulang semua kecuali item terakhir dari daftar?

160

Saya ingin mengulang daftar memeriksa setiap item terhadap yang mengikutinya.

Apakah ada cara saya bisa mengulang semua kecuali item terakhir yang digunakan untuk x in y? Saya lebih suka melakukannya tanpa menggunakan indeks jika saya bisa.

Catatan

freespace menjawab pertanyaan saya yang sebenarnya, itulah sebabnya saya menerima jawabannya, tetapi SilentGhost menjawab pertanyaan yang seharusnya saya tanyakan.

Permintaan maaf untuk kebingungan.

David Sykes
sumber

Jawaban:

316
for x in y[:-1]

Jika ygenerator, maka di atas tidak akan berfungsi.

ruang bebas
sumber
Itu menjawab pertanyaan saya, terima kasih, tetapi saya lupa bertanya bagaimana saya akan mendapatkan item setelah x. Apakah ini mungkin?
David Sykes
3
- 1 Saya tidak berpikir itu menjawab pertanyaan. Itu tidak membandingkan setiap item dengan yang berikutnya. - odwl 0 dtk yang lalu
odwl
4
Saya pikir saya lakukan. Penulis berkata dia ingin melakukan X, kemudian bertanya bagaimana dia bisa melakukan Y. Saya menjawab bagaimana dia bisa melakukan Y. Bahwa dia menerima jawaban saya akan menunjukkan saya menjawab pertanyaan yang dia tanyakan, jika bukan pertanyaan dia benar - benar ingin bertanya. Penanya dipersilakan untuk menurunkan jawaban ini.
freespace
7
Hanya karena OP seharusnya mengajukan pertanyaan lain di awal, tidak berarti pertanyaannya dan jawaban ini tidak terlalu berguna bagi orang lain. +1
Prof. Falken
1
Anda menyebutkan bahwa ini tidak berfungsi untuk generator. Apa alternatifnya ketika ygenerator?
Joost
50

cara termudah untuk membandingkan item urutan dengan yang berikut:

for i, j in zip(a, a[1:]):
     # compare i (the current) to j (the following)
SilentGhost
sumber
15
Ini menjawab pertanyaan yang saya harap telah saya tanyakan. Terima kasih
David Sykes
3
Sebenarnya, Anda dapat menghilangkan irisan pertama, karena zip memotong daftar yang lebih panjang dengan panjang yang lebih pendek. Ini akan menghemat satu pembuatan daftar. (Kalau-kalau Anda berurusan dengan daftar besar. Tapi dalam kasus itu, Anda harus mengikuti pendekatan Semut Aasma, yang tidak menyalin apa pun.)
bayer
19

Jika Anda ingin mendapatkan semua elemen dalam urutan pasangan secara bijak, gunakan pendekatan ini (fungsi berpasangan adalah dari contoh dalam modul itertools).

from itertools import tee, izip, chain

def pairwise(seq):
    a,b = tee(seq)
    b.next()
    return izip(a,b)

for current_item, next_item in pairwise(y):
    if compare(current_item, next_item):
        # do what you have to do

Jika Anda perlu membandingkan nilai terakhir dengan beberapa nilai khusus, rangkai nilai itu sampai akhir

for current, next_item in pairwise(chain(y, [None])):
Semut Aasma
sumber
harap dicatat, bahwa penggunaan berikutnya untuk bayangan nama variabel built-in
SilentGhost
1
Saya pribadi tidak keberatan membayangi builtin kurang digunakan ketika ruang lingkup variabel kecil dan nama baik untuk dibaca. Meskipun demikian diedit nama variabel untuk mempertahankan praktik pengkodean yang baik.
Semut Aasma
5

jika Anda bermaksud membandingkan item ke-n dengan item ke-1 dalam daftar yang juga dapat Anda lakukan

>>> for i in range(len(list[:-1])):
...     print list[i]>list[i+1]

perhatikan tidak ada pengkodean yang terjadi di sana. Ini seharusnya ok kecuali Anda merasa sebaliknya.

Perpetualcoder
sumber
3
Anda dapat mengganti len (daftar [: - 1]) dengan len (daftar) - 1 untuk menghindari salinan daftar. Dan hindari menggunakan daftar variabel bernama ...
Remy Blank
2

Untuk membandingkan setiap item dengan item berikutnya dalam iterator tanpa membuat daftar:

import itertools
it = (x for x in range(10))
data1, data2 = itertools.tee(it)
data2.next()
for a, b in itertools.izip(data1, data2):
  print a, b
odwl
sumber
2
itulah yang disarankan oleh Semut Aasma stackoverflow.com/questions/914715/...
SilentGhost
1

Ini menjawab apa yang seharusnya ditanyakan OP , yaitu melintasi daftar yang membandingkan elemen berurutan ( jawaban SilentGhost yang luar biasa ), namun digeneralisasi untuk grup mana pun ( n-gram ): 2, 3, ... n:

zip(*(l[start:] for start in range(0, n)))

Contoh:

l = range(0, 4)  # [0, 1, 2, 3]

list(zip(*(l[start:] for start in range(0, 2)))) # == [(0, 1), (1, 2), (2, 3)]
list(zip(*(l[start:] for start in range(0, 3)))) # == [(0, 1, 2), (1, 2, 3)]
list(zip(*(l[start:] for start in range(0, 4)))) # == [(0, 1, 2, 3)]
list(zip(*(l[start:] for start in range(0, 5)))) # == []

Penjelasan:

  • l[start:] menghasilkan daftar / generator mulai dari indeks start
  • *listatau *generator: meneruskan semua elemen ke fungsi penutup zipseolah-olah dituliszip(elem1, elem2, ...)

catatan:

AFAIK, kode ini sangat malas. Tidak diuji.

juanmirocks
sumber