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.