Python - Ініціалізація декількох списків / рядків


80

Це жахливо потворно:

psData = []
nsData = []
msData = []
ckData = []
mAData = []
RData = []
pData = []

Чи є спосіб оголосити ці змінні в одному рядку?


1
Я не думаю, що це потворно, особливо якщо ви робите psData = [] # Якийсь коментар, що пояснює, що там
екстранеон

3
Потворність чи ні, остерігайтеся тих імен, настільки подібних одне до одного: psData та pdata, mAData та msData ...
Франческо

1
-1: Не замінюйте це якоюсь конструкцією "кодового гольфу", яка використовує мінімальну кількість натискань клавіш. Це добре. Все, що є більш лаконічним, збентежить і розчарує людей, які хочуть підтримувати цю програму. Дійсно, все більш неясне, ніж це, швидше за все, буде переписано на це.
S.Lott

Не повинно бути незрозумілим, якщо кодер включає коментар, який пояснює, що робить рядок коду, наприклад # ініціалізувати змінні списку
CCKx

Відповіді:


190
alist, blist, clist, dlist, elist = ([] for i in range(5))

Недоліком вищевказаного підходу є те, що вам потрібно підрахувати кількість імен ліворуч =і мати рівно стільки ж порожніх списків (наприклад, черезrange дзвінка, або більш чітко) з правого боку.

Головне, не використовуйте щось подібне

alist, blist, clist, dlist, elist = [[]] * 5

ні

alist = blist = clist = dlist = elist = []

що змусило б усі імена посилатися на той самий порожній список!


@thenickname, завжди радий допомогти!
Alex Martelli

4
Чудова відповідь, я намагався виконати стиль С alist, blist, clist = []і, поки не знайшов цього
Бас Янсен

1
Чи стосується це і словників?
ром

3
Так, це стосується і словників. Це те, що я шукав, поки не натрапив на це питання та відповідь.
CCKx

Дякую за пояснення; перший рядок - це те, що я шукав.
Luke Davis


10

Залежно від ваших потреб, ви можете розглянути можливість використання дефолтного рішення з фабрикою списків. Щось на зразок:

my_lists = collections.defaultdict(list)

а потім ви можете безпосередньо додавати до my_lists ["psData"] тощо. Це відповідна сторінка документа: http://docs.python.org/library/collections.html#collections.defaultdict


1
Дякую за це! Мені подобається, що python дозволяє мені писати корисний код як новачкові, але він також має стільки розширених функцій, що я можу продовжувати вчитися вдосконалювати свій код.
ворпал

Це одна з його сильних сторін і свідчить про винахідливість Гвідо та інших основних учасників мовного дизайну!
Франческо

1

Трохи ефективніший підхід:

alist, blist, clist, dlist, elist = ([] for _ in xrange(5))

[ ПРИМІТКА ]:

  • xrange()є оптимальнішим, ніж range()у Python2 . ( Посилання )

  • iМінлива була непридатна тому використання _краще. ( Посилання )

  • xrange()не визначено в Python3 .


Як щось може бути "більш оптимальним", ніж щось інше? :)
Берс

0

Маючи на увазі, що охайність може мати наслідки роботи. Виклик функції діапазону трохи уповільнить процес ініціювання. Будьте обережні, якщо у вас є якийсь процес, який потрібно багато разів перевстановлювати змінну.

import time
def r_init():
    st=time.time()
    alist, blist, clist, dlist, elist = ([] for i in range(5))
    et=time.time()
    print("{:.15f}".format(et-st))

def p_init():
    st=time.time()
    alist=[];blist=[];clist=[];dlist=[];elist=[]
    et=time.time()
    print("{:.15f}".format(et-st))

for x in range(1,10):
    r_init()
    p_init()
    print("\n")

-1

Ви можете використовувати клас для ініціалізації / зберігання даних, це займе більше рядків, але може бути простішим для читання та більш об’єктно-орієнтованим.

Подібно до:

class Data:
    def __init__(self):
        self.var1=[]
        <etc.>
    def zeroize(self):
        self.var1=[]
        <etc.>

Тоді в основному біля початку:

data=Data()

Тоді у ваших циклах або в будь-якому місці декларації основного повідомлення ви можете використовувати клас.

data.var1.append(varN)
if(something):
    data.zeroize()

це, по суті, також просто припис - це не вирішує питання ОП і не простіше, ОП, очевидно, хотів менше коду і менше клопоту, це не те. однак, це інший тип вирішення проблеми, який щось заслуговує, але це можна зробити набагато краще, також ви використовували деякі дивні імена.
Inbar Rose

-5

Щось на зразок

alist, blist, clist, dlist, elist = ([],)*5

здається найелегантнішим рішенням.


3
alist.append("oops"); print(blist): ['oops'].
Берс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.