Добавление новых строк в список списков - PullRequest
1 голос
/ 05 февраля 2012

Кто-нибудь знает синтаксис превращения списка списков в нечто похожее на то, что я нарисовал ниже?

Список списков будет выглядеть так:

list = [0, [~, ~, ~], 1, [~, ~, ~], 2, [~, ~, ~] ]

И это желаемый вывод:

0 ~ ~ ~
1 ~ ~ ~
2 ~ ~ ~   

Я видел, как другие люди задавали аналогичный вопрос, однако в их подсписках был только один элемент, и перед каждым подсписком также не было целочисленных элементов, поэтому они использовали следующее для получения результата что мне нужно:

"\n".join(item[0] for item in list)

Я не уверен, как манипулировать приведенной выше строкой кода, чтобы решить мою конкретную проблему. Я пытался изменить

item[0] to item[0:len(sub_list)] 

и многое другое, но ничего не помогло. (Я не очень разбираюсь в Python)

Любая помощь будет принята с благодарностью. Спасибо.

Ответы [ 8 ]

6 голосов
/ 05 февраля 2012

Всегда можно использовать явную итерацию двойками:

el = [0, ['~', '~', '~'], 1, ['~', '~', '~'], 2, ['~', '~', '~'] ]
for i in range(0, len(el), 2):
    print el[i], " ".join(el[i+1])

В настоящее время я не могу придумать ничего более умного.

2 голосов
/ 05 февраля 2012

Не такой умный или лаконичный, как другие ответы, но определенно читаемый:

# This function is taken from 
# /332773/kak-razbit-spisok-na-kuski-odinakovogo-razmera
def chunks(l, n):
    """ Yield successive n-sized chunks from l.
    """
    for i in xrange(0, len(l), n):
        yield l[i:i+n]

my_list = [0, ['~', '~', '~'], 1, ['~', '~', '~'], 2, ['~', '~', '~'] ]

paired = chunks(my_list, 2)

for index, lst in paired:
    print index, ' '.join(lst)
1 голос
/ 05 февраля 2012

Прежде всего, давайте исправим это определение:

lst = [0, ['~', '~', '~'], 1, ['~', '~', '~'], 2, ['~', '~', '~']]

Пожалуйста, никогда не используйте list в качестве имени идентификатора.Она скрывает встроенную функцию list.

. Чтобы упростить эту задачу, преобразуйте ее в простой список списков:

lst = [[lst[i]] + lst[i+1] for i in xrange(0, len(lst), 2)]

Затем join, что:

print "\n".join([" ".join(map(str, x)) for x in lst])
0 голосов
/ 05 февраля 2012

Без индекса и без создания списка или подсписка:

lst = [0, ['~', '~', '~'], 1, ['~', 889, '~'], 2, ['~', '~', ('a','b')], 3, ['#', '#'] ]

it = iter(lst)
print '\n'.join( '%s %s' % (x,' '.join(str(u) for u in next(it))) for x in it)

результат

0 ~ ~ ~
1 ~ 889 ~
2 ~ ~ ('a', 'b')
3 # #
0 голосов
/ 05 февраля 2012

Вы можете перебирать список по частям (по два элемента за раз), используя стандартную идиому "grouper" :

L = [0, ['~', '~', '~'], 1, ['~', '~', '~'], 2, ['~', '~', '~']]
print('\n'.join("%s %s" % (i, ' '.join(lst)) for i, lst in zip(*[iter(L)]*2)))
Выход
0 ~ ~ ~
1 ~ ~ ~
2 ~ ~ ~
0 голосов
/ 05 февраля 2012

Если ваш список действительно имеет такую ​​точную структуру (не элемент списка в четных позициях, элемент списка в нечетных позициях), вы можете сделать это:

def pairs(l):
    i = iter(l)
    while 1:
        yield (i.next(), i.next())
print '\n'.join(['%s %s' % (f, ' '.join(s)) for f, s in pairs(list)])
0 голосов
/ 05 февраля 2012

Во-первых, я использую zip(), чтобы сгруппировать ваш список по двум группам. Затем я перебираю подсписок и использую join(), чтобы соединить его элементы с пробелом, добавить его к первому элементу и, наконец, соединить все строки с помощью строки прерывания (\n) .

>>> my_list = [0, [11, 1.2, 'str1'], 1, [21, 2.2, 'str2'], 2, [31, 3.2, 'str3'] ]
>>> it = iter(my_list)
>>> my_str = '\n'.join((str(x) + ' ' + ' '.join(str(y) for y in l)) for x, l in zip(it, it))
>>> print my_str
0 11 1.2 str1
1 21 2.2 str2
2 31 3.2 str3

Это решение будет работать с любым типом в вашем списке и подсписках.

0 голосов
/ 05 февраля 2012

Вы можете использовать понимание по индексам вплоть до длины списка

'\n'.join('%s %s' % (list[2 * i], list[2 * i + 1]) for i in [0:len(list)/2])
...