2014-02-02 3 views
-2

у меня есть список списков вроде этого:список список длина + конкатенация на неровных списках

list = [[11, 12, 13, 14] [15, 16, 17]] 

Я хочу, чтобы измерить длину каждого подсписка

t=[] 
for item in list[0]: 
    t.append(len(item)) 

Теперь я хочу, чтобы создать соответствие список списков, который будет состоять из строки «Точка» и числа из ранее измеренной длины списка:

new_list=[] 

new_list = "Point" += (x) 

for i in t: 
    x = i+1 
    new_list.append (("Point" += (x) += "=")) 

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

new_list = [[Point 1, Point 2, Point 3, Point 4][Point 1, Point 2, point 3 ]] 

Как бы я правильно соединил это?

Спасибо,

Konrad

+0

Не называйте список 'list', потому что вы перезаписать список конструктор Питона ... – dawg

+2

Вы полностью изменили вопрос сейчас, делая счета объекта - будь то руководство или 'itertools.count' - совершенно ненужно. – DSM

ответ

0

Альтернативный способ заключается в использовании класса счета:

class Count(object): 
    def __init__(self, start=0): 
     self.count=start 

    def __call__(self): 
     self.count+=1 
     return self.count 

c=Count()   
li = [[11, 12, 13, 14], [15, 16, 17]] 
print([['Point %i = %i' % (c(),e) for e in sl] for sl in li]) 
# [['Point 1 = 11', 'Point 2 = 12', 'Point 3 = 13', 'Point 4 = 14'], ['Point 5 = 15', 'Point 6 = 16', 'Point 7 = 17']] 

С вашим обновление:

print [['Point %i' % (i) for i, e in enumerate(sl, 1)] for sl in li] 
# [['Point 1', 'Point 2', 'Point 3', 'Point 4'], ['Point 1', 'Point 2', 'Point 3']] 
+0

Это сработало как шарм. предыдущие ответы не работали, так как у меня не было модуля intertools. Я получал ошибки при импорте intertools. – konrad

+0

Какая у вас среда? Модуль itertools является частью стандартного дистрибутива. – dawg

+0

Что делать, если я хотел напечатать только точку (x). В основном измерьте длину подсписного текста и распечатайте список точек (x), соответствующих его длине. – konrad

1

Вот лучший способ использования itertools.count, string formatting и вложенную list comprehension.

>>> from itertools import count 
>>> lis = [[11, 12, 13, 14], [15, 16, 17]] 
>>> c = count(1) 
>>> [['Point {} = {}'.format(next(c), y) for y in x] for x in lis] 
[['Point 1 = 11', 'Point 2 = 12', 'Point 3 = 13', 'Point 4 = 14'], ['Point 5 = 15', 'Point 6 = 16', 'Point 7 = 17']] 

Update:

Использование enumerate вместо itertools.count, чтобы получить новый счетчик для каждого подсписка:

>>> [['Point {} = {}'.format(i, y) for i, y in enumerate(x, 1)] for x in lis] 
[['Point 1 = 11', 'Point 2 = 12', 'Point 3 = 13', 'Point 4 = 14'], ['Point 1 = 15', 'Point 2 = 16', 'Point 3 = 17']] 
+0

это здорово! Я забыл упомянуть, что я хотел, чтобы он перезапустил нумерацию для каждого подсписок, чтобы получить [[точка 1, точка 2, точка 3, точка 4] [точка 1, точка 2, точка 3]] – konrad

+0

@ user3263488 Не моя ошибка, вы отправили неверный вывод. Кстати, я обновил решение. –

0

Я хочу, чтобы измерить длину каждого подсписка

Вместо использования цикла и добавления предпочтительным способом является использование List List или map.

lst = [[11, 12, 13, 14], [15, 16, 17]] 
map(len, lst) 

Теперь я хочу, чтобы создать список совпадающих списков, будет состоять из строки «Точка» и число от длины списка ранее измеренное:

На самом деле, вы не; потребность для вычисления длины каждого подсписника отдельно. Вместо этого (поскольку ваша структура списка согласована и известна), создайте понимание вложенного списка и используйте str.format вместе с счетчиком (itertools.count), чтобы воссоздать список в желаемом формате.

Реализация

>>> lst = [[11, 12, 13, 14], [15, 16, 17]] 
>>> from itertools import count 
>>> cnt = count(1) 
>>> pprint.pprint([["Point {} = {}".format(next(cnt), e) 
      for e in sublist] for sublist in lst]) 

Выход

[['Point 0 = 11', 'Point 1 = 12', 'Point 2 = 13', 'Point 3 = 14'], 

[ 'Точка 4 = 15', 'Точка 5 = 16', 'Точка 6 = 17']]

+1

Убейте вас, BTW вам нужно 'count (1)'. –

+0

@AshwiniChaudhary: Я вижу сейчас. На волосок от. Позвольте мне подумать о другом ответе, иначе я его удалю – Abhijit

Смежные вопросы