2015-06-03 23 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) 

我需要后者的构造,因为其意图是迭代列表集合并将每个条目转换为Point。这个怎么做?

+0

您应该使用地图或列表理解。 – Alik

+0

@Alik请明确表示:即显示一些代码。如果您注意到OP包含尝试的列表理解。 – javadba

+3

我不明白你想用''map'实现什么。 ''[tokarr] [tokarr]不是'''足够吗? – 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'你都有一个一维列表。然后你在它上面画一个“Point”;这会导致为'tokarr'的每个元素调用具有1个参数的'Point'(该错误告诉2个参数,因为它计算''self''),当它需要18时。 – fjarri

+0

明白了。实际上,其他答案leekaiinthesky是第一个直接解决我滥用二维数组的问题。你的答案都很好,但我只能拿一个答案。 – javadba