【问题标题】:Function that transforms a list in a list of dictionary转换字典列表中的列表的函数
【发布时间】:2018-05-18 20:15:32
【问题描述】:

我必须创建一个函数,其目的是接收参数列表。

比如这个:

['music', ' extension=mp3', 'reports/INFOB131', ' extension=doc,docx,pdf', ' name_contains=INFOB131', ' max_size=100000', 'reports/INFOB132', ' extension=doc,docx,pdf', ' name_contains=INFOB132', ' max_size=100000', 'games', ' name_contains=SC2,Wesnoth', 'pictures/Namur', ' extension=jpeg', ' min_size=5000000', ' name_contains=cercle', 'pictures/autres', ' extension=jpeg', ' min_size=5000000']

并返回一个类似这样的列表:

data_config = [{'music' : {'extension':'mp3'}}, {'reports/INFOB131': {'extension': ['doc', 'docx','pdf'], 'name_contains':'INFOB131', 'max_size':100000}}, {'reports/INFOB132': {'extension': ['doc', 'docx','pdf'], 'name_contains':'INFOB132', 'max_size':100000}}]

所以我做了那个功能:

def my_function(list_in_question, my_config_list =[], prev_list = []):
    """ """
    enumerated_list = list(enumerate(list_in_question))

    if not '=' in enumerated_list[0][1]:
        main_key = enumerated_list[0][1]# référencé avant assignement
        pre_dict = {main_key : {}}


        for i in enumerated_list[1:]:

            if '=' in i[1] :
                splitted = i[1].split('=')
                prev_list.append({splitted[0] : splitted[1]})

            elif not '=' in i[1] and i[1] != main_key:
                for j in prev_list:
                    pre_dict[main_key].update(j)

                my_config_list.append(pre_dict)

                return my_function(list_in_question[i[0]:])

            elif not '=' in i[1] and i[1] == main_key and main_key!= enumerated_list[0][1]:
                return my_config_list
    else:
        print("The format of the file containig the data in not adequate !")

但我不明白为什么当我以这种方式执行它时:

new_lines = ['music', ' extension=mp3', '', 'reports/INFOB131', ' extension=doc,docx,pdf', ' name_contains=INFOB131', ' max_size=100000', '', 'reports/INFOB132', ' extension=doc,docx,pdf', ' name_contains=INFOB132', ' max_size=100000', '', 'games', ' name_contains=SC2,Wesnoth', '', 'pictures/Namur', ' extension=jpeg', ' min_size=5000000', ' name_contains=cercle', '', 'pictures/autres', ' extension=jpeg', ' min_size=5000000']

my_function(new_lines)

我最终得到了这个输出......

None

如果有人可以帮助我,我将非常感激,

谢谢!

PS:如果有人知道我如何在没有循环的情况下以递归方式进行操作,那就太棒了!

大家...谢谢!你真的帮助了我,你所有的答案都很棒,我有一些问题要理解一些部分,所以我会再烦你一些代码问题。不管怎样,谢谢你花时间帮助我,你们都帮了我很大的忙!!!

【问题讨论】:

  • return my_config_list 结束你的函数,然后返回列表。

标签: python list function loops dictionary


【解决方案1】:

试试下面的代码;

def foo(my_list):
    # Create an iterator
    list_iter = iter(my_list)
    # zip the iterator with itself
    key_val_tuple = zip(list_iter, list_iter) # This will group two items in the list at a time
    output_list = []
    for i in key_val_tuple:
        value_dict = {}
        value = i[1].split('=')
        value_dict[value[0]] = value[1].split(",") if len(value[1].split(","))>1 else value[1]
        element_dict = {}
        element_dict[i[0]] = value_dict
        output_list.append(element_dict)
    return output_list

input_list = ['music', ' extension=mp3', 'reports/INFOB131', ' extension=doc,docx,pdf', ' name_contains=INFOB131', ' max_size=100000', 'reports/INFOB132', ' extension=doc,docx,pdf', ' name_contains=INFOB132', ' max_size=100000', 'games', ' name_contains=SC2,Wesnoth', 'pictures/Namur', ' extension=jpeg', ' min_size=5000000', ' name_contains=cercle', 'pictures/autres', ' extension=jpeg', ' min_size=5000000']

# Call the function foo
output = foo(input_list)
print(output) # python3

得到以下输出

[{'music': {'extension': 'mp3'}}, {'reports/INFOB131': {'extension': ['doc', 'docx', 'pdf']}}, {' name_contains=INFOB131': {'max_size': '100000'}}, {'reports/INFOB132': {'extension': ['doc', 'docx', 'pdf']}}, {'name_contains=INFOB132' : {'max_size': '100000'}}, {'games': {'name_contains': ['SC2', 'Wesnoth']}}, {'pictures/Namur': {'extension': 'jpeg'} }, {'min_size=5000000': {'name_contains': 'cercle'}}, {'pictures/autres': {'extension': 'jpeg'}}]

  • zip(list_iter, list_iter) :这将一次将列表中的两个项目分组。

    输出:[('music', 'extension=mp3'), ('reports/INFOB131', 'extension=doc,docx,pdf'), ...]

参考:

【讨论】:

  • 非常感谢!它工作得很好!只是一个问题,你能解释一下 zip() 和 iter() 的用法吗?
  • 请使用正确的 cmets 和参考链接查看更新的答案。如果您还有任何疑问,请告诉我..
【解决方案2】:

再一次尝试只使用列表和字典:

def make(lst):
    data_config=[]
    for st in lst:
        if '=' not in st:            # new entry
            dd = dict()
            dds = dd[st] = dict()
            data_config.append(dd)            
        else:                        # fill entry
            k,v = st.split('=')
            if ',' in v:
                v = v.split(',')
            dds[k] = v          
    return data_config  

对于:

In [564]: make(l)
Out[564]: 
[{'music': {' extension': 'mp3'}},
 {'reports/INFOB131': {' extension': ['doc', 'docx', 'pdf'],
   ' max_size': '100000',
   ' name_contains': 'INFOB131'}},
 {'reports/INFOB132': {' extension': ['doc', 'docx', 'pdf'],
   ' max_size': '100000',
   ' name_contains': 'INFOB132'}},
 {'games': {' name_contains': ['SC2', 'Wesnoth']}},
 {'pictures/Namur': {' extension': 'jpeg',
   ' min_size': '5000000',
   ' name_contains': 'cercle'}},
 {'pictures/autres': {' extension': 'jpeg', ' min_size': '5000000'}}]

【讨论】:

  • 很棒且易于理解!我是初学者,所以这对我来说似乎很完美!
  • 所以检查一下 ;) .
【解决方案3】:

另一种方法:

import re

def my_function(list_in_question, my_config_list=[], prev_list=[]):
    """ """
    result = {}
    main_key = ''

    for element in list_in_question:
        if element == '':
            main_key = ''
        if re.search('=', element):
            key, value = element.split('=')
            print "key, value = ", key, value
            if re.search(',', value):
                value_list = value.split(',')
                print "value list =", value_list
                result[main_key][key] = value_list
            else:
                result[main_key][key] = value

        else:
            main_key = element
            result[main_key] = {}

    return (result)

new_lines = ['music', ' extension=mp3', '', 'reports/INFOB131', ' extension=doc,docx,pdf', ' name_contains=INFOB131',
             ' max_size=100000', '', 'reports/INFOB132', ' extension=doc,docx,pdf', ' name_contains=INFOB132',
             ' max_size=100000', '', 'games', ' name_contains=SC2,Wesnoth', '', 'pictures/Namur', ' extension=jpeg',
             ' min_size=5000000', ' name_contains=cercle', '', 'pictures/autres', ' extension=jpeg',
             ' min_size=5000000']

print (my_function(new_lines))

【讨论】:

  • 感谢您的帮助,代码有效,我遇到的唯一问题是我按此顺序获取代码:
  • {'games': {'name_contains': ['SC2', 'Wesnoth']}, 'music': {' extension': 'mp3'}, 'pictures/Namur': { 'extension': 'jpeg', 'min_size': '5000000', 'name_contains': 'cercle'}, 'pictures/autres': {'extension': 'jpeg', 'min_size': '5000000'}, '报告/INFOB131':{'扩展名:['doc','docx','pdf'],'max_size':'100000','name_contains':'INFOB131'},'reports/INFOB132':{'扩展名': ['doc', 'docx', 'pdf'], 'max_size': '100000', 'name_contains': 'INFOB132'}}
【解决方案4】:

您需要遍历列表一次。模式是这样的:

  1. 开始一个空列表(我们称之为new_list)
  2. 您在原始列表 (original_list) 中找到了一个元素。
  3. 如果不包含“=”,则在 new_list 中创建一个新字典
  4. 如果它包含'='符号,则将元素拆分为k和v('='之前和之后),并在new_list的最后一个条目中,为唯一的键添加一个键值对

    def parse_list(original_list):
        new_list=[]
    
        for element in original_list:
            if not '=' in element:
                new_list.append({element:{}})
            else:
                k,w=element.split('=')
                new_list[-1][new_list[-1].keys()[0]][k]=w
        return new_list
    
    new_lines = ['music', ' extension=mp3', '', 'reports/INFOB131', ' extension=doc,docx,pdf', ' name_contains=INFOB131', ' max_size=100000', '', 'reports/INFOB132', ' extension=doc,docx,pdf', ' name_contains=INFOB132', ' max_size=100000', '', 'games', ' name_contains=SC2,Wesnoth', '', 'pictures/Namur', ' extension=jpeg', ' min_size=5000000', ' name_contains=cercle', '', 'pictures/autres', ' extension=jpeg', ' min_size=5000000']
    
    parse_list(new_lines)
    

现在我应该解释一下 return 语句之前的那一行:

  • new_list[-1] 是对应于在 original_list 中找到的最后一个不带等号的条目的字典。第一次通过循环后,

    new_list=[{'音乐': {}}]

  • 在第二轮中

    new_list[-1]={'音乐': {}}

    new_list[-1].keys()=['music']

    new_list[-1].keys()[0]='音乐'

    new_list[-1][new_list[-1].keys()[0]]={}

  • 现在您只需使用已解析的 k,w 对更新此字典

【讨论】:

  • 感谢您的帮助,如果您能帮助我理解这一行: new_list[-1][new_list[-1].keys()[0]][k]=w ,为什么 [-1] 以及 .keys() 做什么?
  • [-1] 是列表中最后一个元素的索引。 somelist[-1] 与 somelist[len(somelist)-1] 相同。 keys() 函数从字典中返回键。 {'extension': ['doc', 'docx','pdf'], 'name_contains':'INFOB131', 'max_size':100000}.keys() 应该返回 ['max_size', 'name_contains', 'extension ']。我知道您的主要词典只包含一个关键字(例如“音乐”),所以我抓取了该列表中的第一个(也是唯一一个)元素,因此我可以访问该值(包含所有其他键值对的字典)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-18
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
  • 2017-04-23
  • 2021-10-13
相关资源
最近更新 更多