2015-03-31 3 views
3

Так что я list of lists так:Python - «Объединение» список списков различных типов

my_list = [['hi','Ohio',[1,0.0]],['bye','NewYork',[2,0.0]],['go','Maine',[3,0.0]]] 

Как вы можете видеть, он имеет 3 различных типов (string, ints и floats).

И мне нужно «присоединиться» к подспискам вместе, чтобы вывести новый список с формой:

>>> new_list 

[['hiOhio10.0'], ['byeNewYork20.0'], ['goMaine30.0']] 

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

>>> new_list = [["".join(["".join(str(a)) for a in b])] for b in mylist] 

Но это дало мне выход:

>>> new_list 

[['hiOhio[1, 0.0]'], ['byeNewYork[2, 0.0]'], ['goMaine[3, 0.0]']] 

, который не совсем то, что я был после.

Другие вещи, которые я пробовал:

  1. Добавление другой для петли в ранее показанном списке понимание.

    Например:

    [[["".join(["".join(str(c)) for c in a])]for a in b] for b in my_list] 
    

    Но это дало мне эту ошибку:

    Traceback (most recent call last): 
        File "<pyshell#88>", line 1, in <module> 
        [[["".join(["".join(str(c)) for c in a])]for a in b] for b in my_list] 
    TypeError: 'int' object is not iterable 
    
  2. Я также попытался следующие this SO question на 'список уплощение', но похоже, что бы расширить каждый запись в моем списке, которую я не хочу

Любая помощь и/или советы будут замечательными!

ответ

1

почему быть сложным, когда вы можете просто сделать это с для цикла

 new_list=[''.join(str(y) for x in z for y in x) for z in my_list] 
+0

Это на самом деле то, что я пытался сделать с самого начала! Благодаря! – logic

3

Вы можете попробовать этот список постижение

>>> [[''.join(i[:2])+''.join(map(str,my_list[0][2]))] for i in my_list] 
[['hiOhio10.0'], ['byeNewYork10.0'], ['goMaine10.0']] 

Успенским - подсписки всегда, как упоминалось

Docs для - map

+0

Примечание - 'map' медленнее, чем список понимания, когда есть использование' функций lambda'. [Проверить это] (http://stackoverflow.com/questions/1247486/python-list-comprehension-vs-map) –

+0

@logic В любое время! Все лучшее в будущем! –

1

Мы можем использовать map запустить lambda что уплощается каждый элемент и join s им, после него join s элементы каждого третьего элемента в каждом списке:

map(lambda x: ["".join([x[0], x[1], "".join(map(str, x[2]))])], my_list) 

Результат

[['hiOhio10.0'], ['byeNewYork20.0'], ['goMaine30.0']] 
+0

Мне это нравится, потому что он решает точно заданную проблему, не получая чрезмерно общий характер. Однако, я думаю, что карта + лямбда более четко выражена как понимание списка: '[" ".join ([x [0], x [1]," ".join (map (str, x [2]))]) для x в my_list] '. Понимание короче и должно быть более эффективным. (Но, конечно, это затем превратит ваш ответ в @ BhargavRao's.) –

+0

@StevenRumbalski Вы правы, мне действительно нравится ваше предложение (и BhargavRao) лучше, чем мой ответ. Любая карта + лямбда может быть интерпретирована в понимании списка - и это более питонический способ делать что-то (а также более эффективно в соответствии с тем, что я читал). – alfasin

3

Немного более читаемый и менее подвержены ошибки:

def concat(item): 
    if type(item) is list: 
     return ''.join([concat(i) for i in item]) 
    # else: 
    return str(item) 

[concat(item) for item in my_list] 
+0

Спасибо! Это работает и для других дел! :) – logic

+0

Более читаемый бьет лаконичность в любое время, вы получили мой плюс один :) – alfasin

0

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

[''.join(map(str, flatten(sublist))) for sublist in my_list] 

Вот flatten я использовал (адаптировано из How can I flatten lists without splitting strings?:

def flatten(it): 
    for item in it: 
     if hasattr(item, '__iter__') and not isinstance(item, basestring): 
      for subitem in flatten(item): 
       yield subitem 
     else: 
      yield item 

Есть другие хорошие способы сплющиваются в flattening a shallow list in python. В основном они не добавляют специальный случай для строк, но это может и не иметь значения.

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