如何使用位置来指示键和值,从列表中创建新字典?

时间:2019-07-03 19:16:52

标签: python-3.x list dictionary

我正在尝试确定某些软件包中使用最频繁的用户。我有一个列表,其中包含软件包和用户。我想将它们转换成字典,以包名作为键,用户名作为值。列表的模式是:

list = ['package1', 'userA', 'userB', 'package2', 'userC', 
        'userD', 'package3', 'userE', 'userF', ...]

我想要:

dict = {'package1': ['userA', 'userB'], 
        'package2': ['userC', 'userD'],
        'package3': ['userE', 'userF'],
        ...}

我希望能够通过名称而不是位置来匹配包裹。我目前有类似的东西:

dict={}
for x in list:
    if "package" in x:
        dict.fromkeys(list, x)

感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

这是使用简单迭代的一种方法。

例如:

lst = ['package1', 'userA', 'userB', 'package2', 'userC', 'userD', 'package3', 'userE', 'userF']
result = []
for i in lst:
    if i.startswith("package"):
        result.append([i])
    else:
        result[-1].append(i)

result = {i: v for i, *v in result}
print(result)

输出:

{'package1': ['userA', 'userB'],
 'package2': ['userC', 'userD'],
 'package3': ['userE', 'userF']}

答案 1 :(得分:0)

查看此代码;

In [1]: raw_data = ['package1', 'userA', 'userB', 'package2', 'userC', 'userD', 
   ...: 'package3', 'userE', 'userF']                                           

In [2]: data = {}                                                               

In [3]: for el in raw_data: 
   ...:     if el.startswith('package'): 
   ...:         lastkey = el 
   ...:         data[el] = [] 
   ...:     else:
   ...:         data[lastkey].append(el) 
   ...:                                                                         

In [4]: data                                                                    
Out[4]: 
{'package1': ['userA', 'userB'],
 'package2': ['userC', 'userD'],
 'package3': ['userE', 'userF']}

答案 2 :(得分:-1)

如果您可以始终依靠两个用户,那么您可以轻松地使用具有索引和切片功能的字典理解来生成所需的键和值列表:

output = {lst[i]: lst[i+1:i+3] for i in range(0, len(lst), 3)}

但是,如果用户数量可能是可变的,则需要完整循环。您需要记住您所看到的最新软件包,并将每个后续用户放入其关联的列表中:

output = {}
current_package = unpackaged_users = []
for item in lst:
    if item.startswith('package'):
        current_package = []
        output[item] = current_package
    else: # or elif item.startswith('user')?
        current_package.append(item)

unpackaged_users变量将包含在看到第一个包之前输入中包含的所有用户的列表。如果在代码中无法做到这一点,则可以取消该变量(并且如果不在循环前初始化current_package,则在出现这种情况时会出现异常)。 / p>