2015-06-03 2 views
0

Рассмотрим массив из двух списков:Преобразование массив списков

In [98]: toks 
Out[98]: 
[['1.423', 
    '0.046', 
    '98.521', 
    '0.010', 
    '0.000', 
    '0.000', 
    '5814251520.0', 
    '769945600.0', 
    '18775908352.0', 
    '2.45024350208e+11', 
    '8131.903', 
    '168485.073', 
    '0.0', 
    '0.0', 
    '0.022', 
    '372.162', 
    '1123.041', 
    '1448.424'], 
['71.765', 
    '0.478', 
    '27.757', 
    '0.0', 
    '0.0', 
    '0.0', 
    '5839618048.0', 
    '769945600.0', 
    '18776162304.0', 
    '2.44998729728e+11', 
    '0.0', 
    '0.0', 
    '1640.0', 
    '1608.0', 
    '0.0', 
    '3775.0', 
    '12858.0', 
    '6723.0']] 

Таким образом, мы хотели бы, чтобы преобразовать список в Поинт

Point = namedtuple('Point', 'usr sys idl wai hiq siq used buff cach free 
    read writ recv send majpf minpf alloc vmfree') 

Выполнение преобразования непосредственно делает работы:

In [99]: Point(*toks[0]) 
Out[99]: Point(usr='1.423', sys='0.046', idl='98.521', wai='0.010', hiq='0.000', siq='0.000', used='5814251520.0', 
buff='769945600.0', cach='18775908352.0', free='2.45024350208e+11', read='8131.903', writ='168485.073', recv='0.0', 
    send='0.0', majpf='0.022', minpf='372.162', alloc='1123.041', vmfree='1448.424') 

Но попытка создания Точки с помощью итерации не :

pts = [map(lambda x: Point(*x), tokarr) for tokarr in toks] 


In [90]: pts = [map(lambda x: Point(*x), tokarr) for tokarr in toks0] 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-90-a30764943aa1> in <module>() 
----> 1 pts = [map(lambda x: Point(*x), tokarr) for tokarr in toks0] 

<ipython-input-90-a30764943aa1> in <lambda>(x) 
----> 1 pts = [map(lambda x: Point(*x), tokarr) for tokarr in toks0] 

TypeError: __new__() takes exactly 19 arguments (2 given) 

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

+0

Вы должны использовать картографию или список. – Alik

+0

@Alik Пожалуйста, укажите: код. Если вы заметили, что OP включает в себя попытку просмотра списка. – javadba

+3

Я не понимаю, чего вы пытаетесь достичь с помощью '' map''. Не '' [Точка (* tokarr) для tokarr в toks] '' достаточно? – fjarri

ответ

2

Я думаю, что, как вы пытались использовать map не совсем верно. Вы хотите, чтобы lambda применялся к каждому элементу корневого списка, а не к каждому элементу каждого дочернего списка, правильно?

Это вы что искали?

pts = map(lambda x: Point(*x), toks) 
+0

Да, это тоже работает. – javadba

+0

На самом деле этот ответ наиболее непосредственно касается моего неправильного использования списков. Благодарю. – javadba

3

Просто

pts = [Point(*tokarr) for tokarr in toks] 

будет работать.

Если вы хотите сделать это с map:

pts = list(map(lambda x: Point(*x), toks)) 
+0

да, что делает работу: и будет присуждать за десять минут или около того, чтобы ждать. Тем временем: почему моя (явно избыточная) конструкция карты вообще не работает? – javadba

+0

Каждый 'tokarr' у вас есть 1D-список. Затем вы накладываете над ним «точку»; это приводит к вызову 'Point' с 1 аргументом для каждого элемента' tokarr' (ошибка сообщает о 2 аргументах, потому что он считает '' self''), когда требуется 18. – fjarri

+0

Получил. На самом деле другой ответ leekaiinthesky был первым, кто обратился к моему неправильному использованию 2d массива напрямую. Оба ваших ответа хороши, но я могу только наградить их. – javadba

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