合并两个Python元组列表

时间:2014-05-14 16:08:10

标签: python

我有两个元组列表。每个元组都包含一个datetime对象和一个float对象,即:

l1 = [(dt1), 1.0), (dt2, 2.0), (dt3, 3.0)]
l2 = [(dt1), 1.0), (dt3, 3.0), (dt5, 6.0)]

这两个列表已经按每个元组的日期时间排序。

合并两个列表的快捷方法是什么?

这两个列表可能不包含相同的日期时间。 如果一个列表中存在一个dt而另一个列表中不存在,则缺失值可以是''

所以例如使用上面的两个列表我想生成

l = [(dt1), 1.0, 1.0), (dt2, 2.0, ''), (dt3, 3.0, 3.0), (dt5, '', 6.0)]

我猜测也许我应该使用dt作为键的字典,然后采取行动 似乎很浪费。

还有其他想法吗?

由于

3 个答案:

答案 0 :(得分:1)

l1 = [("a", 1.0), ("b", 2.0), ("c", 3.0)]
l2 = [("a", 1.0), ("c", 3.0), ("d", 6.0)]


i1 = 0
i2= 0
l = []
while i1 != len(l1) or i2!=len(l2):
    print i1,i2
    if ((i1<len(l1))and(i2<len(l2))) and l1[i1] ==l2[i2]:
        l.append((l1[i1][0],l1[i1][1],l2[i2][1]))
        i1 +=1
        i2+=1
    elif ((i1<len(l1)and i2<len(l2)) and l1[i1] <l2[i2]) or (i1<len(l1)and i2>=len(l2)):
        l.append((l1[i1][0],l1[i1][1],""))
        i1 +=1

    elif ((i2<len(l2)and i1<len(l1)) and l1[i1] >l2[i2])or (i1>=len(l1)and i2<len(l2)):
        l.append((l2[i2][0],l2[i2][1],""))
        i2 +=1    

我想我现在也修复了边缘案例。

答案 1 :(得分:0)

如果它有用,我使用了不同的方法:

result = []
d2 = dict(l2)
for i in l1:
    j = ''
    if i[0] in d2:
        j = d2[i[0]]
        d2.pop(i[0], None)
    result.append((i[0], i[1], j))

for key in d2:
    result.append((key, '', d2[key]))

答案 2 :(得分:0)

我和Moe的回答大致相同。请注意,第二个列表中元组中的第二个值始终作为合并列表中元组的第三个元素放置

结果为Merge_List(l1,l2),其中Merge_List为:

def Merge_List(Left,Right,Merged=[]):
    if len(Left)==0 and len(Right)==1:
        return Merged+[(Right[0][0],"",Right[0][1]),]
    elif len(Right)==0 and len(Left)==1:
        return Merged+[Left[0]+("",),]
    else:
        if Left[0][0] < Right[0][0]:
            return Merge_List(Left[1:],Right,
                           Merged=Merged+[Left[0]+("",),])
        elif Right[0][0] < Left[0][0]:
            return Merge_list(Left,Right[1:],
                           Merged=Merged+[(Right[0][0],"",Right[0][1]),])
        else:
            return Merge_List(Left[1:],Right[1:],
                           Merged=Merged+[(Left[0][0],Left[0][1],Right[0][1]),])