Python 3 dönüş aralığı bir listeye


178

1-1000İçinde sayılar olan bir liste yapmaya çalışıyorum . Açıkçası bu yazmak / okumak için can sıkıcı olurdu, bu yüzden içinde bir aralık ile bir liste yapmaya çalışıyorum. Python 2'de şöyle görünüyor:

some_list = range(1,1000)

Python 3'te aralık xrangePython 2'ye benzer mi?

Herkes bu konuda bir fikir verebilir mi?


1
Ayrıca, some_list[i] == i+1muhtemelen zaten bir listeye ihtiyacınız yok.
njzk2

1
@RikPoggi. örneğin, bir çizim fonksiyonu için bir liste sağlanması gerekebilir. Bazen bir aralık yeterli olur, ancak bir aralık birleştirilemez (değiştirilemez), bu nedenle, çizilen tüm listelere varsayılan bir başlangıç ​​değeri eklemeniz gerekiyorsa, bunun da bir listeye dönüştürülmesi gerekir.
SherylHohman

Yanıtlar:


223

Range nesnesinden bir liste oluşturabilirsiniz:

my_list = list(range(1, 1001))

Bunu python2.x içindeki jeneratörlerle de böyle yaparsınız. Genel olarak konuşursak, muhtemelen my_list[i]daha verimli bir değere ( i + 1) sahip olabileceğiniz için bir listeye ihtiyacınız yoktur ve sadece yinelemeniz gerekiyorsa, geri çekilebilirsiniz range.

Ayrıca python2.x üzerinde xrangehala endekslenebilir 1 olduğunu unutmayın . Bu range, python3.x üzerinde aynı özelliğe sahip olduğu anlamına gelir 2

1print xrange(30)[12] python2.x için çalışıyor

2 python3.x dosyasındaki 1'e benzer bir deyimdir print(range(30)[12])ve bu da işe yarar .


4
Bu kesinlikle gitmek için bir yol, ama bir nitpick: bu gerçekten bir "döküm" değil
jterrace

@jterrace "yayın" ı "dönüştür" olarak değiştirdi. Oyuncu olmama konusunda haklısın ... Tam olarak ne diyeceğimi bilmiyorum.
mgilson

2
Ben "yapı" ya da "yapı" (ya da muhtemelen "materyalize") söyleyebilirim - bir jeneratörü bir listeye "dönüştürmediğiniz" için bir veri kaynağından yeni bir liste nesnesi oluşturuyorsunuz bir jeneratör olmak ... (ama yine de kılları bölmek ve yine de lehine ne% 100 emin değilim)
Jon Clements

2
Diğer OO dilleriyle tutarlı olduğundan "yapı" için + 1'im. list(arg)Bir kurucu çağırmak gibi diğer dillerde anlaşılmaktadır listsınıfın. Aslında, aynı zamanda Python vakasıdır. Nesnenin inşaat sırasında (C ++ durumunda olduğu gibi) veya yalnızca ilk otomatik olarak çağrılan yöntem (Python __init__()yönteminde olduğu gibi) sırasında doldurulup doldurulmadığı temel soyut fikri değiştiremez. Benim görüşüme göre , liste oluşturucu yineleyici alır ve döndürülen değerleri listeyi doldurur .
pepr

2
Neden jupyter not defterinde bir hata veriyor ve kabukta iyi çalışıyor? Hata:'range' object is not callable
subtleseeker

34

Pythons <= 3.4'te, diğerlerinin önerdiği gibi, list(range(10))aralık dışında bir liste yapmak için kullanabilirsiniz (Genel olarak, yinelenebilir).

3.5Paketleme genellemeleriyle Python'da tanıtılan bir başka alternatif, *bir liste hazırlığında kullanmaktır []:

>>> r = range(10)
>>> l = [*r]
>>> print(l)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Bu eşdeğer olmasına rağmen list(r), gerçek bir sözdizimidir ve hiçbir işlev çağrısının yer almaması, daha hızlı çalışmasına izin vermez. Golf kodlamanız gerekiyorsa, aynı zamanda daha az karakter :-)


4
Açık olmak gerekirse, yine de tek satırlık olabilir: herhangi bir amaç için [*range(10)]ihtiyaç duymadığınızda rangeancak list. Yan not: Ambalajdan çıkarma genellemelerinin en sevdiğim (tamam, gerçekten değil) kısmı, boş olanların setartık gerçek bir sözdizimine sahip {*()}olduğum ya da benim dediğim gibi, tek gözlü maymun operatörü. ;-)
ShadowRanger

@ShadowRanger yazmayı bu şekilde düşündüm. Yeni Python kullanıcılarını karıştırmamak için biraz daha ayrıntılı olmaya karar verdim :-)
Dimitris Fasarakis Hilliard

26

Python 3.x'te, range()işlev kendi türüne sahiptir. yani bu durumda yineleyici kullanmalısınız

list(range(1000))


11
"bu durumda yineleyici kullanmalısınız"? Bu ne anlama geliyor?
user2357112 Monica

2
Python 3.7 kullanıyorum ve x = list (range (1000)) denedim ama TypeError hatası aldım: 'list' nesnesi çağrılabilir değil
Earthshaker

@Earthshaker gibi bir yazım hatası olmalılist(range(1000))()
wjandrea

17

Python3'ün doğrudan menzilli bir liste almak için bir işlevden yoksun olmasının nedeni, orijinal Python3 tasarımcısının Python2'de oldukça acemi olmasıdır. Yalnızca range()bir for döngüsünde işlev kullanımını düşündü , bu nedenle listenin asla genişletilmesi gerekmemelidir. Aslında, çoğu zaman range()bir liste üretmek ve bir işleve geçmek için işlevi kullanmamız gerekir .

Bu nedenle, bu durumda Python3, Python2'ye kıyasla daha az uygundur, çünkü:

  • Python2'de var xrange()ve range();
  • Python3, biz var range()velist(range())

Yine de, liste genişletmeyi şu şekilde kullanabilirsiniz:

[*range(N)]

3
Bütün mesele , a yapmak için daha az uygun hale getirmektir list, çünkü bu genellikle yanlış bir şeydir. 99 100 üzerinden kullanım durumları için, gerçek bir yapım listberi, verimsiz ve anlamsız rangekendisi boot bazen daha verimli, hemen hemen her şekilde değişmez bir dizisi gibi davranır (örn içerme testleri ints vardır O(1), vs O(n)için lists). Python 2'de, neredeyse her zaman daha iyi bir seçenek rangeolmasına rağmen , insanlar varsayılan olarak kullanma eğilimindeydi xrange; Python 3'te, listyanlış adı kullanarak yanlışlıkla almamak için açık bir şekilde seçim yapabilirsiniz .
ShadowRanger

7
Python 3 tasarımcısı ve Python 2'deki uzmanlığı hakkındaki yorum oldukça cesur ve belirsiz.
kazarey

@kazarey Ama bu doğru mu?
Python'da

1
Liste oluşturmak için özellikle açma-stenografi için oy, ama @kazarey ile katılıyorum. Tasarımcı hakkındaki yorum hem temelsizdir (ya da en azından referanslarla desteklenmez) hem de gereksizdir.
Nubarke

12

Listede 1-1000 sayılarını kullanmanıza gerek yoktur. Ancak bir nedenden dolayı bu sayılara gerçekten ihtiyacınız varsa, şunları yapabilirsiniz:

[i for i in range(1, 1001)]

Kısaca Anlama Listesi:

Yukarıdaki liste anlama şu anlama gelir:

nums = []
for i in range(1, 1001):
    nums.append(i)

Bu, sadece liste anlama sözdizimidir, ancak 2.x'ten itibaren. Bunun python 3'te çalışacağını biliyorum, ancak yükseltilmiş bir sözdizimi olup olmadığından emin değilim

Aralık, ilk parametreyi içeren başlar; ancak ikinci Parametreyi Dahil Etmeden Biter (2 parametre sağlandığında; ilk parametre kapalı bırakılırsa, '0' ile başlar)

range(start, end+1)
[start, start+1, .., end]

20
Neden anlama? Sadece:list(range(1000))
Rik Poggi

Teşekkürler! Neden benim için değil, benim için olduğumu açıklar mısın?
Kayıkhane

Python3 ile çalışmadım. Bu yüzden nasıl çalıştığından tam olarak emin değilim. Anlayışların işe yarayacağını biliyorum, ancak dökümde% 100 değildi. Ancak döküm işe yarıyorsa, haklısınız ve yolunuz daha pitonik.
inspectorG4dget

1
@ inspectorG4dget: "Döküm" değil, list()kurucuya yinelenebilir bir çağrı yapıyor . list()Yapıcı herhangi iterable nesne verildiğinde yeni bir liste oluşturmak bilir.
Greg Hewgill

4
@ inspectorG4dget: list(range(1000))python2'de olduğu gibi list(xrange(1000))python3'te çalışacak
Rik Poggi

4

Aslında, 1-1000 (dahil) istiyorsanız, range(...)işlevi parametre 1 ve 1001: ile kullanın range(1, 1001), çünkü range(start, end)işlev başlangıçtan (bitiş-1), dahil olur.


0

Python 3'te Aralık Kullanın .

İşte iki sayıdan sayılar arasında dönen bir örnek işlev

def get_between_numbers(a, b):
    """
    This function will return in between numbers from two numbers.
    :param a:
    :param b:
    :return:
    """
    x = []
    if b < a:
        x.extend(range(b, a))
        x.append(a)
    else:
        x.extend(range(a, b))
        x.append(b)

    return x

Sonuç

print(get_between_numbers(5, 9))
print(get_between_numbers(9, 5))

[5, 6, 7, 8, 9]  
[5, 6, 7, 8, 9]

Bu farklı bir soruyu cevaplıyor gibi görünüyor ...?
wjandrea

-1

Aslında, bu Python2 ile karşılaştırıldığında Python3'ün geriye dönük bir derecesidir. Kesinlikle, range () ve xrange () kullanan Python2, sırasıyla list (range ()) ve range () kullanan Python3'ten daha kullanışlıdır. Çünkü Python3'ün orijinal tasarımcısı çok deneyimli değil, sadece yeni başlayanlar tarafından aralık işlevinin kullanımını hem bellek hem de CPU verimsiz olduğu çok sayıda öğe üzerinde yinelemek için kullandılar; ancak bir sayı listesi oluşturmak için range işlevinin kullanımını ihmal ettiler. Şimdi, zaten değişmeleri için çok geç.

Python3'ün tasarımcısı olsaydım:

  1. sıra yineleyici döndürmek için irange kullanın
  2. sıra listesini döndürmek için lrange kullanın
  3. sekans yineleyicisini (eleman sayısı büyükse, örneğin aralık (9999999) veya bir sekans listesini (eleman sayısı azsa, örneğin aralık (10)) döndürmek için aralığı kullanın

Bu optimal olmalı.


Bu soruya nasıl cevap veriyor?
wjandrea

Evet, soruyu Python3 geliştiricilerinden Python3'ü değiştirmelerini ve geliştirmelerini isteyerek cevaplıyor. Ancak o kadar zarif olmadıkları için değişmeleri pek olası değildir.
xuancong84
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.