2017-09-21 70 views
1

所以我有这个2列出的清单列表合并:操纵根据指数

list1=[['user1', 186, 'Feb 2017, Mar 2017, Apr 2017', 550, 555], ['user2', 282, 'Mai 2017', 3579, 3579]] 

list2=[['user1', 186, 'Feb 2017, Mar 2017, Apr 2017, Mai 2017', 0, 740]] 

^^这只是一个例子,我将有更多的名单内,但原则和格式将是相同的。我将解释我希望如何格式化我所需的输出:当list2 [0] [1] == list1 [0] [1](在我的例子中,186 == 186)替换所有的list2 [0] on如果你没有匹配list2 [0] [1] == list1 [0] [1](在我的例子user2中是list1 [0],但只保留list1 [0] [3](在我的例子550中) - 282不匹配)将该列表照原样并仅将索引[4]修改为0(将变成如下形式:['user2',282,'Mai 2017',3579,0])

I会把我想要的输出,所以你会更好地理解它:

desiredlist = [['user2', 282, 'Mai 2017', 3579, 0], ['user1', 186, 'Feb 2017, Mar 2017, Apr 2017, Mai 2017', 550, 740]] 

我想有一个功能,可以做到这一点,我开始工作就可以了,我这个结束:

def mergesafirmacheta(safir,macheta): 
    combined_list = macheta + safir 
    final_dict = {tuple(i[:2]):tuple(i[2:]) for i in combined_list} 
    merged_list = [list(k) + list (final_dict[k]) for k in final_dict] 
    return merged_list 

但是,如果我打印desiredlist = mergesafirmacheta(列表2,列表1)我会得到:

[['user2', 282, 'Mai 2017', 3579, 3579], ['user1', 186, 'Feb 2017, Mar 2017, Apr 2017, Mai 2017', 0, 740]] 

我怎样才能得到我想要的输出I” m使用python 3!谢谢!

回答

0

由于您似乎有结构化的数据,我建议您创建类用户并使用对象进行操作。

class User: 
    def __init__(self, nick, id_, months, a, b): 
     self.nick = nick 
     self.id_ = id_ 
     self.months = months 
     self.a = a 
     self.b = b 

    def __str__(self): 
     return "{self.nick}, {self.id_}, {self.months}, {self.a}, {self.b}".format(**locals()) 

您将拥有更多可读代码。

list1 = [ 
    User('user1', 186, 'Feb 2017, Mar 2017, Apr 2017', 550, 555), 
    User('user2', 282, 'Mai 2017', 3579, 3579), 
] 
list2 = [ 
    User('user1', 186, 'Feb 2017, Mar 2017, Apr 2017, Mai 2017', 0, 740), 
] 

for outdated in list1: 
    updateds = [u for u in list2 if outdated.id_ == u.id_] 
    if updateds: 
     outdated.nick = updateds[0].nick 
     outdated.months = updateds[0].months 
     outdated.b = updateds[0].b 
    else: 
     outdated.b = 0 

for user in list1: 
    print(user) 
+0

我开始列出一个列表作为数据结构,并且我无法完全回到对象,我测试了你的代码,但是对于user2来说,最后一个元素是3579而不是0像我想要的输出。 –

+0

@TatuBogdan我现在看,编辑。那么,我不会强迫你,但过了一段时间,你不会知道你的代码是干什么的。 – pacholik

0

从例子,我猜你会使用namedtuples然而,该解决方案是基于列表理解获益:

desiredlist=[list2[0][:3]+[n2,list2[0][4]] if n1==list2[0][1] 
      else [id,n1,dates,n2,0] for id,n1,dates,n2,n3 in list1] 

使用namedtuples你会碰到这样的:

from collections import namedtuple 
Record=namedtuple("Record","Id n1 dates n2 n3") 
Example1=Record('user1', 186, 'Feb 2017, Mar 2017, Apr 2017', 550, 555) 
Example2=Record('user2', 282, 'Mai 2017', 3579, 3579) 
Example3=Record('user1', 186, 'Feb 2017, Mar 2017, Apr 2017, Mai 2017', 0, 740) 
list1=[Example1,Example2] 
# Instead of creating a list of 1 element (list2) I would rather compare it against the namedtuple directly 
list2=Example3 
# now the merging would look like this 
desiredlist=[Record(*list2[:3],n2=i.n2,n3=list2.n3) if i.n1==list2.n1 
     else Record(*i[:4],n3=0) for i in list1] 
# now desiredlist would look like: 
[Record(Id='user1', n1=186, dates='Feb 2017, Mar 2017, Apr 2017, Mai 2017', n2=550, n3=740), Record(Id='user2', n1=282, dates='Mai 2017', n2=3579, n3=0)] 

如果您不需要追加或更改每条记录的内容,它将使用namedtuples节省空间,它将帮助您保持记录更具可读性。否则,你将不得不使用一个可变容器,不管它是字典还是列表

+0

感谢您的回复,我需要将我的数据保存在列表的列表中,无法与元组一起使用。 –

+0

那么答案的第一部分可能会适合您的需求 –

+0

哦,我错过了那个抱歉,现在正在测试,会回来,并接受答案,如果它的工作! –