2014-09-12 5 views
2

Есть ли простой способ конвертировать список парных в список списков парных?Список Python в список списков

Например:

[1.0, 2.0, 3.0] 

в

[[1.0], [2.0], [3.0]] 

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

ответ

18

Просто используйте list-comprehension оборачивать каждый элемент в списке:

l = [1.0, 2.0, 3.0] 
print [[x] for x in l] 
[[1.0], [2.0], [3.0]] 
2

В качестве альтернативы списковых, вы можете попробовать map:

>>> map(lambda x: [x], l) 
[[1.0], [2.0], [3.0]] 

Это дает желаемый результат, применяя lambda (здесь, взяв объект и помещая его в список) каждому элементу l в свою очередь.

В Python 3 map возвращает итератор, поэтому используйте list(map(lambda x: [x], l)), чтобы получить список.


Использование map примерно в два раза медленнее списка понимания для небольших списков floats, потому что построение функции lambda влечет за собой небольшие накладные расходы:

>>> %timeit [[x] for x in l] 
1000000 loops, best of 3: 594 ns per loop 

>>> %timeit map(lambda x: [x], l) 
1000000 loops, best of 3: 1.25 us per loop 

Для более длинных списков, временной промежуток между двумя запусками чтобы закрыть, хотя понимание списка остается preferred option in the Python community.

+0

* Интересно *? Кажется совершенно очевидным, почему .. См. Http://stackoverflow.com/questions/1247486/python-list-comprehension-vs-map BTW, мне нравится 'map' more;) –

+0

Спасибо, что указали это - d означало слово * интересно * означать «стоит отметить», а не «таинственно» ... Я уточню свой ответ с лучшим выбором слова и объясню причину, по которой :-) –

+0

Если вы узнаете способ не используйте 'lambda' здесь, тогда' map' будет быстрее! –

0

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

def convert(l): 
    converted = [] 
    if isinstance(l, list): 
     if len(l) > 0: 
      for n in l: 
       converted.append([n]) 
    return converted 

l = [1.0, 2.0, 3.0] 
print convert(l) 

Вы также можете проверить погоду каждого элемента в списке поплавок или нет и вызвать ошибку, если один из них не является:

class NotFloatError(Exception): 

    def __init__(self, message): 
     Exception.__init__(self, message) 

def convert(l): 
    converted = [] 
    if isinstance(l, list): 
     if len(l) > 0: 
      for n in l: 
       if isinstance(n, float): 
        converted.append([n]) 
       else: 
        raise NotFloatError("An element in the list is not a float.") 
    return converted 

l = [1.0, 2.0, 3.0] 
print convert(l) 
+2

Я бы сказал, что это более загадочно, чем понимание списка на милю. – Derek

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