Python 将三个不同的列表配对

Python 将三个不同的列表配对,python,python-3.x,list,Python,Python 3.x,List,我有以下的口述: authorvals= [ { "author": "author1", "year": [ "2016" ], "value1": 4.0 }, { "author&q

我有以下的口述:

 authorvals= [
        {
            "author": "author1",
            "year": [
                "2016"
            ],
            "value1": 4.0
        },
        {
            "author": "author2",
            "year": [
                "2016"
            ],
            "value1": 2.0
        },
        {
            "author": "author1",
            "year": [
                "2016"
            ],
            "value3": 1.0
        },
        {
            "author": "author1",
            "year": [
                "2016"
            ],
            "value2": 4.0
        },
        {
            "author": "author2",
            "year": [
                "2016"
            ],
            "value2": 2.0
        }]
现在我想从这篇文章中列出如下内容:

val_list=["value1","value2","value3"]
num_list=[[4,2],[4,2],[1,0]]
auth_list=["author1","author2"]
我想把这条口述分成三份单独的清单

  • 第一个列表是dict中的键“value”+x
  • 第二个列表是 auth1和auth2的特定键的值
  • 第三张名单只是 作者名单
  • 我尝试了以下代码:

    num_list=[]
    auth_list=[]
    val_list=[]
    for item in authors_dict: 
            if item['author'] not in auth_list: 
                auth_list.append(item['author']) 
                for k in item.keys(): 
                    if k.startswith("value") and k not in val_list: 
                        val_list.append(k) 
                        val_list.sort() 
                        for v in val_list:
                            temp_val_list = [] 
                            for i in authors_dict: 
                                try: 
                                    val = i[v] 
                                    temp_val_list.append(val) 
                                except: 
                                    pass
                            if len(temp_val_list) > 0: 
                                num_list.append(temp_val_list) 
                                print(val_list) 
                                print(num_list) 
                                print(auth_list)
    
    但这不是我想要完成的 num_列表的最后一个列表中的0是因为author2没有值。如果没有值,则应打印0

  • 集合作者
  • 在defaultdict中收集键和值
  • 通过将填充添加到maxlength对值进行后处理
  • 给予:

    (
        ['author2', 'author1'],
        ['value1', 'value3', 'value2'],
        [[4, 2], [1, 0], [4, 2]]
    )
    

    有两件事我不太清楚,所以我做了一些假设:

  • 值的顺序并不重要
  • 所有值的出现次数应与最大值的出现次数相同。如果不是,则在该值的
    num_列表中添加零
  • 以下代码应可用于此目的:

    val_list=[]
    num_list=[]
    auth_list=[]
    max_values = 0
    
    for d in authorvals:
        if d["author"] not in auth_list:
            auth_list.append(d["author"])
        for key in d:
            if key.startswith("value"):
                if key not in val_list:
                    val_list.append(key)
                    num_list.append([d[key]])
                    max_values = max(max_values, 1)
                else:
                    idx = val_list.index(key)
                    num_list[idx].append(d[key])
                    max_values = max(max_values, len(num_list[idx]))
    
    for sublist in num_list:
        if len(sublist) != max_values:
            padding = [0] * (max_values - len(sublist))
            sublist.extend(padding)
    
    print(val_list)  # ['value1', 'value3', 'value2']
    print(num_list)  # [[4.0, 2.0], [1.0, 0], [4.0, 2.0]]
    print(auth_list) # ['author1', 'author2']
    
    auth_list=set([x['author']代表authorvals中的x])#如果您需要通过索引访问它,您可以将类型强制转换为list
    索引={}#便于表示
    对于authorvals中的身份验证:
    keys=auth.keys()
    过滤=键。uuuu sub_uuuuuuuuuu(['author','year'])。uuu iter_uuuuuuuuuuuu()。uuuuuuu next_uuuuuuu()。#从键列表中删除'author'和'year'键,并获取第一个值
    如果indexed.get(filtered)为None:
    索引[筛选]=[]#如果找不到相同的键名,则初始化
    索引[filtered]。追加(auth[filtered])#将迭代中的值追加到相应的索引中
    val_list=list(index.keys())
    num_list=[索引[键]用于val_list中的键]
    

    请注意,
    num\u列表
    可能有所不同,因为每个成员的对数没有提供的示例中所示的固定成员数,但您始终可以在之后处理它们

    filtered=keys.。\uuuu sub\uuuuuuu(['author','year'])[0]#从键列表TypeError中删除“author”和“year”键:“set”对象不可订阅@darkash我得到了这个error@Sam我已经修改了答案,应该能够立即运行。不保证项目以“值”开头。这只是一个示例。它可以是数据、流程或其他任何内容@kluvin@Sam,请参阅修订后的答案。我担心排序可能会有问题,因为字典通常不能保证这一点。编辑:,看起来这不是问题:)不保证项目以“值”开头。这只是一个示例。它可以是数据、流程或任何其他@Saad Hussain
    val_list=[]
    num_list=[]
    auth_list=[]
    max_values = 0
    
    for d in authorvals:
        if d["author"] not in auth_list:
            auth_list.append(d["author"])
        for key in d:
            if key.startswith("value"):
                if key not in val_list:
                    val_list.append(key)
                    num_list.append([d[key]])
                    max_values = max(max_values, 1)
                else:
                    idx = val_list.index(key)
                    num_list[idx].append(d[key])
                    max_values = max(max_values, len(num_list[idx]))
    
    for sublist in num_list:
        if len(sublist) != max_values:
            padding = [0] * (max_values - len(sublist))
            sublist.extend(padding)
    
    print(val_list)  # ['value1', 'value3', 'value2']
    print(num_list)  # [[4.0, 2.0], [1.0, 0], [4.0, 2.0]]
    print(auth_list) # ['author1', 'author2']