2012-10-01 85 views
2

有時候我遇到了信息存在於兩個數據集中的問題。儘管我使用Access來配對數據,然後將其導出到CSV,但這很麻煩。其他時候,我使用循環遍歷這兩個列表並匹配數據,但它不能很好地擴展。如何根據索引值匹配值?

我想知道是否有更有效的Python方法來「鏈接」數據。以下是我正在談論的一個示例

在這種情況下,一個數據集包含製造商和型號,另一個包含原產國。我希望能夠在數據集A和B合併成一個數據集用於出口,分析等

A=[['Chevy','Suburban'],['Toyota','Camry'],['Honda','Civic']] 
B=[['Chevy','America'],['Toyota','Japan'],['Honda','Japan']] 

AB =[['Chevy','Suburban','America'],['Toyota','Camry','Japan'],['Honda','Civic','Japan']] 

一如往常的任何幫助表示讚賞!

+1

也許這樣的事情? 'map(lambda x:x [0] + [x [1] [1]],zip(A,B))' – Blender

+0

在這種情況下,它們是有序的,但在大多數情況下它們不是。代碼看起來很方便!我將把它保存在我的片段庫中 – canyon289

回答

3

我覺得你可以考慮使用collections.namedtuple爲了這個目的:

>>> from collections import namedtuple 
>>> MakeOrigin = namedtuple('MakeOrigin', ['make', 'origin']) 
>>> MakeModel = namedtuple('MakeModel', ['make', 'model']) 
>>> A = [MakeModel('Chevy', 'Suburban'), MakeModel('Toyota', 'Camry'), MakeModel('Honda', 'Civic')] 
>>> B = [MakeOrigin('Chevy', 'America'), MakeOrigin('Toyota', 'Japan'), MakeOrigin('Honda', 'Japan')] 
>>> AB = [[a.make, a.model, b.origin] for a in A for b in B if a.make == b.make] 
>>> AB 
[['Chevy', 'Suburban', 'America'], ['Toyota', 'Camry', 'Japan'], ['Honda', 'Civic', 'Japan']] 

這是更具可讀性,並允許更有趣的操作。


不使用namedtuple

>>> A=[['Chevy','Suburban'],['Toyota','Camry'],['Honda','Civic']] 
>>> B=[['Chevy','America'],['Toyota','Japan'],['Honda','Japan']] 
>>> 
>>> AB = [[a[0], a[1], b[1]] for a in A for b in B if a[0] == b[0]] 
>>> AB 
[['Chevy', 'Suburban', 'America'], ['Toyota', 'Camry', 'Japan'], ['Honda', 'Civic', 'Japan']]