Python- Як стварыць новы спіс з зменных у цыкле?

Мой канкрэтны прыклад паскладаней, таму я кіпячонае паняцце да простага прыкладу:

l = [1,2,3,4,5,6,7,8]

for number in l:
    calc = number*10
    print calc

Для кожнай ітэрацыі майго цыклу, я ў канчатковым выніку з зменнай ( расч ) Я хацеў бы выкарыстаць, каб запоўніць новы спіс. Мой рэальны працэс уключае ў сябе значна больш, чым множання значэння на 10 , так што я хацеў бы быць у стане ўсталяваць кожнае значэнне ў новым спісе з дапамогай гэтага метаду. Новы код можа выглядаць наступным чынам:

l = [1,2,3,4,5,6,7,8]

for number in l:
    calc = number*10
    set calc as x'th entry in a new list called l2 (x = iteration cycle)

print l2

Then it would print the new list: [10,20,30,40,...]

2
Чаму вы не можаце проста зрабіць l2.append (вапнавае) ?
дададзена аўтар Ryan Saxe, крыніца

6 адказы

Ёсць некалькі варыянтаў ...

апісанняў спісаў

Выкарыстоўвайце спіс разуменне , калі досыць кароткім:

new_list = [number * 10 for number in old_list]

<�Код> карта()

You could also use <�Код> карта() , if the function exists before (or you will eg. use lambda):

def my_func(value):
    return value * 10

new_list = map(my_func, old_list)

Be aware, that in Python 3.x <�Код> карта() does not return a list (so you would need to do something like this: new_list = list(map(my_func, old_list))).

Запаўненне іншы спіс, выкарыстоўваючы просты для ... у завесы

У якасці альтэрнатывы можна выкарыстоўваць просты цыкл - гэта ўсё яшчэ дзейнічае і Pythonic:

new_list = []

for item in old_list:
    new_list.append(item * 10)

генератары

Sometimes, if you have a lot of processing (as you said you have), you want to perform it lazily, when requested, or just the result may be too big, you may wish to use генератары. генератары remember the way to generate next element and forget whatever happened before (I am simplifying), so you can iterate through them once (but you can also explicitly create eg. list that stores all the results).

У вашым выпадку, калі гэта толькі для друку, вы можаце выкарыстоўваць гэта:

def process_list(old_list):
    for item in old_list:
        new_item = ...  # lots of processing - item into new_item
        yield new_item

А затым раздрукаваць яго:

for new_item in process_list(old_list):
    print(new_item)

More on генератары you can find in Python's wiki: http://wiki.python.org/moin/генератары

Доступ да «нумар ітэрацыі»

Але калі ваш пытанне аб тым, як атрымаць лік ітэрацый, паглядзім на Пералічоны() :

for index, item in enumerate(old_list):
    print('Item at index %r is %r' % (index, item))
6
дададзена

Вось як зрабіць гэта, не скакаць прама ў списковых. Гэта не добрая ідэя выкарыстоўваць л у якасці імя зменнай, паколькі яно ідэнтычна 1 у некаторых шрыфтах, таму я змяніў яго (Althought l1 гэта на самай справе не нашмат лепш :))

l1 = [1,2,3,4,5,6,7,8]
l2 = []
for number in l1:
    calc = number*10
    print calc
    l2.append(calc)

спісачная прадастаўляюць больш кампактны спосаб, каб напісаць гэтую карціну

l2 = [ number*10 for number in l1 ]
4
дададзена
@Seanosapien, вы маеце на ўвазе, чаму нумар знаходзіцца ў вобласці пасля таго, як цыкл завяршаецца? завесы Python не ствараюць новыя магчымасці, таму ўсе зменныя, створаныя ўнутры будзе заставацца ў рамках функцыя (або глабальны маштаб, калі ваш цыкл не ў функцыі)
дададзена аўтар John La Rooy, крыніца
У мяне ёсць пытанне. Чаму Python прысвоіць значэнне 8 нумар і захаваць яго ў якасці зменнай пры выкананні гэтага кода? Добры раствор.
дададзена аўтар Seanosapien, крыніца
@JohnLaRooy, дзякуй за гэта. Я толькі што знайшоў гэта дзіўным, што пераменная захоўваецца пры .append выкарыстоўваецца, але не інакш.
дададзена аўтар Seanosapien, крыніца
просты, дасканалы, дзякуй
дададзена аўтар bigCow, крыніца

Выкарыстоўвайце на слых:

>>> l = [1,2,3,4,5,6,7,8]
>>> l2 = [ item*10 for item in l]
>>> l2
[10, 20, 30, 40, 50, 60, 70, 80]

Што прыкладна адпавядае, але спіс разумення хутчэй, чым звычайна для цыкла:

>>> l2 = []
>>> for number in l:
...     calc = number * 10  #do some more calculations
...     l2.append(calc)     #appends the final calculated value at the end of l2
...     
>>> l2
[10, 20, 30, 40, 50, 60, 70, 80]

Вы таксама можаце стварыць функцыю для ўсіх вылічэнняў вы робіце, а затым выклікаць функцыю ўнутры спісу разумення:

def solve(x):
   #do some calculations here
   return calculated_value

l2 = [ solve(item) for item in l]
2
дададзена
@bigCow выкарыстоўваць другі метад, то, які выкарыстоўвае list.append .
дададзена аўтар Ashwini Chaudhary, крыніца
@Tadeck Я не думаю, што такія людзі, як Карта шмат: stackoverflow.com/a/16329617/846892</а>
дададзена аўтар Ashwini Chaudhary, крыніца
@bigCow: Гэта часта залежыць ад таго, ці ёсць вы, што «шмат пошукаў і разлікаў» заключаны ў адной функцыі - у залежнасці ад таго, зразуменне, завесы або адлюстравання (гл мой адказ) больш ці менш прыдатным. У асноўным гэта зводзіцца да таго, як добра яна выглядае ці як гнуткі павінен быць код, але ёсць розніца невялікая хуткасць (калі ў вас ёсць якія існавалі раней функцыі карта() можа быць найбольш эфектыўным).
дададзена аўтар Tadeck, крыніца
@AshwiniChaudhary: Некаторыя людзі, вядома, не падабаецца Карта() , але ён усё яшчэ мае свае перавагі. Доказ таго, што ён па-ранейшаму неабходна, з'яўляецца той факт, што карта() ня быў выдалены з ўбудаваных функцый у Python 3.x нягледзячы напрыклад. перасоўванне паменшыць() да аднаго з модуляў: дакументаў .python.org/3,1/бібліятэка/functions.html # карта
дададзена аўтар Tadeck, крыніца
Дзякуй за параду. У мяне ёсць шмат разлікаў, якія адбываюцца ў маім канкрэтным прыкладзе, таму я хачу, каб мець магчымасць запоўніць спіс з зменных у цыкле. Ваш прыклад будзе вырашаць пытанне x10, але мая праблема ўключае ў сябе шмат пошукаў і разлікаў для атрымання залежнай пераменнай, вызначанай. Я магу вылічыць значэнне Я хачу ў цыкле проста выдатна, так што я хачу выкарыстоўваць гэтую зменную для запаўнення кожнага элемента ў спісе для кожнай ітэрацыі цыклу.
дададзена аўтар bigCow, крыніца

Просты адказ на вашу праблему будзе дадаць расч у спіс, як паказана ніжэй:

l = [1,2,3,4,5,6,7,8]

your_list = []
for number in l:
    calc = number*10
    your_list.append(calc)

Каб атрымаць доступ да пераменным ў спісе, выкарыстоўвайце сінтаксіс нарэзкі.

то ёсць другі элемент у спісе будзе your_list [1] , 5 your_list [4] .

I suspect you'll need to empty the list at some point. To do so with slicing, use calc[:] = []

0
дададзена
просты, дасканалы, дзякуй
дададзена аўтар bigCow, крыніца

Усе астатнія даў вам правільны адказ: выкарыстоўваць спіс разуменне.

Я дам вам альтэрнатыўны правільны адказ: Выкарыстоўвайце карту з лямбда або функцыі.

Вы можаце выкарыстоўваць лямбда, калі «функцыя» вельмі простая:

print map(lambda x: x*10,[1,2,3,4,5,6,7,8])
# [10, 20, 30, 40, 50, 60, 70, 80]

Функцыя выкарыстоўваецца карта можа быць адвольнай складанасці, і тады прасцей выкарыстоўваць функцыю:

def more_complex(x):
    # can be as complex as a function can be
    # for now -- *10
    return x*10

print map(more_complex,[1,2,3,4,5,6,7,8])

Але гэта будзе працаваць з разуменнем, а таксама:

l2=[more_complex(x) for x in [1,2,3,4,5,6,7,8]]

Проста так, што вы знаёмыя з формай карты супраць спісу разумення.

0
дададзена
Варта адзначыць, што Карта ўяўляе сабой генератар ў Python 3, так што вам трэба абгарнуць яго ў выкліку спіс , калі вы хочаце зрабіць які-небудзь індэксацыі, або што-небудзь яшчэ што патрабуе фактычнага спісу.
дададзена аўтар Blckknght, крыніца

Таму я мяркую, што Вы хацелі б прымяніць функцыю да кожнага элементу спісу.

Ці спрабавалі вы спіс разуменне?

[num*10 for num in l]

Калі даць вам тое, што вам трэба для гэтага простага прыкладу.

Натуральна, калі ў вас ёсць нейкі больш складаны набор аперацый, якія вы можаце выкарыстоўваць функцыю, пэўную раней, а менавіта:

def explode(n):
    return (n + (n * n) - (3 * n))

[explode(num) for num in l]
0
дададзена