Listedeki her öğeye bir tam sayı nasıl eklenir?


135

Varsa ve çıktıyı almak için her bir öğeye list=[1,2,3]eklemek istersem, bunu nasıl yaparım?1[2,3,4]

Bir for döngüsü kullanacağımı varsayıyorum, ancak tam olarak nasıl olduğundan emin değilim.

Yanıtlar:


157
new_list = [x+1 for x in my_list]

6
Bu konuşma bunu açıklıyor: Python Adları ve Değerleri hakkında Gerçekler ve Mitler: nedbatchelder.com/text/names1.html
Ned Batchelder

√ Harika bilgi. Göz açma.
Daniel Springer

3
@DaniSpringer Çünkü bir listeye atamıyorsunuz. Yapmakla aynı şey lst = [1, 2, 3]; e = lst[0]; e += 1. enereden geldiği hakkında herhangi bir bilgi içermez, sadece bir listenin bir elemanının atandığı bir değişkendir. Ona başka bir şey atadıktan sonra liste lstdeğişmeyecektir.
Błażej Michalik

Bu cevap bana çok benziyor.
Daniel Springer

ve muhabir tembel hesapladı:new_list = (x+1 for x in my_list)
Eduardo Pignatelli


24

Listeyi anlama konusundaki diğer cevaplar muhtemelen basit toplama için en iyi bahistir, ancak tüm öğelere uygulamanız gereken daha karmaşık bir işleve sahipseniz, harita iyi bir uyum olabilir.

Örneğinizde şöyle olacaktır:

>>> map(lambda x:x+1, [1,2,3])
[2,3,4]

7
map(1 .__add__, ...)çok çalışıyor. Not arasına boşluk gerektiğini 1ve .bunun bir şamandıra olduğu ayrıştırıcı düşünme önlemek için
John La Rooy

15

numpy kullanmak istiyorsanız, aşağıdaki gibi başka bir yöntem var

import numpy as np
list1 = [1,2,3]
list1 = list(np.asarray(list1) + 1)

13

Düzenleme: bu yerinde değil

Öncelikle değişkeniniz için 'liste' kelimesini kullanmayın. Anahtar kelimeyi gölgelerlist .

En iyi yol, bunu splicing kullanarak yerinde yapmaktır [:], bir splice işaretine dikkat edin :

>>> _list=[1,2,3]
>>> _list[:]=[i+1 for i in _list]
>>> _list
[2, 3, 4]

4
Bu, mevcut listeyi değiştirmek için iyidir, ancak yine de yeni bir liste oluşturur. Gereksiz liste oluşturmayı önlemek için bir jeneratör kullanmak bir şekilde güvenli değil mi? Yani _list[:]=(i+1 for i in _list),.
Alan

bu hala yeni bir liste yaratıyor, for döngüsü olmadan yerinde yapmak mümkün değil
robert king

Neden _list[:]=(i+1 for i in _list)yeni bir liste yarattığını düşünüyorsunuz ?
Alan

Demek istediğim, yerinde, ancak geçici olarak rhs için yepyeni bir liste oluşturacak. Şu yanıtları görün: stackoverflow.com/questions/4948293/… stackoverflow.com/questions/11877212/…
robert king

Ne demek istediğini anlıyorum. Geçici diziye bir liste demek kafamı karıştırdı. Aslında türü hakkında bir şey biliyor muyuz? Bu uygulamaya özel olmaz mıydı?
Alan

9
>>> [x.__add__(1) for x in [1, 3, 5]]
3: [2, 4, 6]

Buradaki amacım, listedeki öğenin çeşitli yerleşik işlevleri desteklediği bir tam sayı olup olmadığını ortaya çıkarmaktır.


7

Python 2+:

>>> mylist = [1,2,3]
>>> map(lambda x: x + 1, mylist)
[2, 3, 4]

Python 3+:

>>> mylist = [1,2,3]
>>> list(map(lambda x: x + 1, mylist))
[2, 3, 4]

3
import numpy as np

np.add([1, 2, 3], 1).tolist()

hangi verir

[2, 3, 4]

2

Bunu yapmanın o kadar verimli değil, benzersiz bir yoluyla karşılaştı. Yani bunu paylaşıyor ve evet başka bir liste için fazladan alan gerektiriyor.

from operator import add
test_list1 = [4, 5, 6, 2, 10]
test_list2 = [1] * len(test_list1)

res_list = list(map(add, test_list1, test_list2))

print(test_list1)
print(test_list2)
print(res_list)

#### Output ####
[4, 5, 6, 2, 10]
[1, 1, 1, 1, 1]
[5, 6, 7, 3, 11]

"ekle" nereden geliyor?
hahnec

add, operatörlerden içe aktarılmalıdır,from operator import add
Rajith Thennakoon

0
list = [1,2,3,4,5]

for index in range(5):
      list[index] = list[index] +1

print(list)

0

Yukarıdaki cevapların çoğu çok iyi. İşi yapacak bazı garip cevaplar da gördüm. Ayrıca, görülen son cevap normal bir döngüdeydi. Bu cevap verme istekliliği beni götürüyor itertoolsvenumpy farklı bir şekilde aynı işi yapacak olan.

Burada işi yapmak için yukarıda cevaplanmamış farklı yollar sunuyorum.

import operator
import itertools

x = [3, 5, 6, 7]

integer = 89

"""
Want more vairaint can also use zip_longest from itertools instead just zip
"""
#lazy eval
a = itertools.starmap(operator.add, zip(x, [89] * len(x))) # this is not subscriptable but iterable
print(a)
for i in a:
  print(i, end = ",")


# prepared list
a = list(itertools.starmap(operator.add, zip(x, [89] * len(x)))) # this returns list
print(a)



# With numpy (before this, install numpy if not present with `pip install numpy`)
import numpy

res = numpy.ones(len(x), dtype=int) * integer + x # it returns numpy array
res = numpy.array(x) + integer # you can also use this, infact there are many ways to play around
print(res)
print(res.shape) # prints structure of array, i.e. shape

# if you specifically want a list, then use tolist

res_list = res.tolist()
print(res_list)

Çıktı

>>> <itertools.starmap object at 0x0000028793490AF0> # output by lazy val
>>> 92,94,95,96,                                     # output of iterating above starmap object
>>> [92, 94, 95, 96]                                 # output obtained by casting to list
>>>                   __
>>> # |\ | |  | |\/| |__| \ /
>>> # | \| |__| |  | |     |
>>> [92 94 95 96]                                    # this is numpy.ndarray object
>>> (4,)                                             # shape of array
>>> [92, 94, 95, 96]                                 # this is a list object (doesn't have a shape)

Benim tek kullanımını vurgulamak için bir neden numpyçok büyük diziler için verimli performans, çünkü hep Numpy gibi kütüphaneler ile böyle yönlendirmeleri yapmak gerektiğidir.

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.