2011-02-02 2 views
3

Я довольно новичок в Python, и я ищу способ распространения элементов в списке на отдельные переменные. Дело в том, что отдельные элементы отображаются как текстовые объекты в Blender. Вот что я до сих пор, но я знаю, что нужно сделать более эффективный способ сделать это.Распределение элементов списка для переменных в python

file = open('lyrics.conf') 
data = file.read() 
file.close() 
b = data.split('/') 
v = len(b) 

if v >= 1: 
    v1 = b[0] 
if v >= 2: 
    v2 = b[1] 
if v >= 3: 
    v3 = b[2] 
if v >= 4: 
    v4 = b[3] 
if v >= 5: 
    v5 = b[4] 
if v >= 6: 
    v6 = b[5] 
if v >= 7: 
    v7 = b[6] 
if v >= 8: 
    v8 = b[7] 
if v >= 9: 
    v9 = b[8] 
if v >= 10: 
    v10 = b[9] 
+7

«Я ищу способ распространения элементов в списке в отдельные переменные». Я не могу придумать ни одной законной причины для этого. Расскажите нам, что вы пытаетесь выполнить, и мы можем показать вам правильный способ сделать это. Что делать, если в списке было 9000 элементов? – Falmarri

+0

Это строго необходимо? Это не очень питонический способ сделать такое. Если вы расскажете нам больше о том, как вы используете v1 ... v10 позже, мы сможем найти вам альтернативу. – chmullig

+0

Хорошо, что я пытаюсь сделать, это взять текст песни и сделать 3D текстовые объекты в Blender из каждого отдельного стиха. Каждый стих будет отдельным объектом в Blender и распределен в случайном месте в 3d пространстве. – levigideon

ответ

1

Чтобы обработать список стихов, стих за стихом:

with open('lyrics.conf') as f: 
    data = file.read() 
verses = data.split('/') 
def build_blender_object(verse): 
    # Put meaningful code here 
    pass 
blender_objects = [build_blender_object(v) for v in verses] 

Тогда делать все, что вы хотите с объектами блендер. Если позиция в списке имеет значение, вы можете использовать enumerate() для связывания индекса с каждым объектом блендера.

5

С b у вас уже есть доступный список предметов, которые вы хотите. Просто обращайтесь к ним, когда вам это нужно по их указателям b[0], b[1], .... Заполнение пространства имен слишком большим количеством переменных, чьи значения могут, без серьезных проблем, храниться в контейнере, является дефектом дизайна (на моих глазах).


Вот способ, чтобы ввести новые переменные в текущем пространстве имен модулей, но это зло:

#!/usr/bin/env python 

import sys 

somelist = range(10) 

for i, item in enumerate(somelist): 
    setattr(sys.modules[__name__], 'v{0}'.format(i), item) 

print v1 + v2 
# => 3 

print v1 * v2 * v3 * v4 * v5 * v6 - v7 * v8 - v9 + 11 
# => ... 
+1

+1: Вместо 'v1',' v2' вы используете 'b [0]' и 'b [1]'. Два дополнительных символа. Так работает язык. –

+0

@ летящие овцы: у вас есть точка, но 'setattr' и семья являются мощными и полезными. Однако в этом случае его не следует использовать.Вот ваша версия oneline: 'from sys import modules as _; [setattr (_ [__ name __], 'v% s'% e, e) для i, e в перечислении (диапазон (10))]; print v1 + v2' – miku

+0

спасибо! я знаю, что setattr полезен; однако здесь это просто взломать. и хаки должны выглядеть loke perl. ;) –

5

, если вы действительно хотите отдельные переменные, в какой-то момент у вас есть по крайней мере, сделать распаковка как v1,v2,v3,v4,v5,v6,v7,v8,v9,v10 = some_list

но зачем вы хотите это делать? если что-то является сборником/списком вещей, оно лучше всего представлено как таковое.

+0

+1 для решения, которое отвечает на заданный вопрос, а не на том, что я думаю, что так должно быть сделано в целом. – Endophage

+0

Ну, честно говоря, он все равно должен проверить длину. мы могли бы стать действительно грязными, используя eval: 'eval (", ". join (" v "+ i для i в диапазоне (len (b))) +" = b ")' или что-то уродливое. –

+0

Нет причин использовать eval, см. Мой ответ. Хотя это так же хаки. – Falmarri

0

Просто для удовольствия

b = "Some text/ with a/slash/character".split('/') 
for i in range(len(b)): 
    globals()['v' + str(i + 1)] = b[i] 
+0

Я попробовал, но он не работает. к счастью, я бы сказал; это ужасно. (это комплимент :)) –

+0

Что не работает? – Falmarri

3

Имея эти v1..10 переменные кажется кодом запах для меня, но вы можете попробовать это

try: 
    v1 = b[0] 
    v2 = b[1] 
    v3 = b[2] 
    v4 = b[3] 
    v5 = b[4] 
    v6 = b[5] 
    v7 = b[6] 
    v8 = b[7] 
    v9 = b[8] 
    v10 = b[9] 
except IndexError: 
    pass 
0

Приемлемо для переменных существовать и установить значение Нет?

v1,v2,v3,v4,v5,v6,v7,v8,v9,v10 = (b+[None]*10)[:10] 

или

v1,v2,v3,v4,v5,v6,v7,v8,v9,v10 = b+[None]*(10-len(b)) 
Смежные вопросы