如何将列表值转换为索引与其他dic值匹配的数组?

时间:2015-04-11 14:16:19

标签: python

希望有人可以帮助我。我花了几个小时试图解决这个问题,并且公平警告,我仍然对python很新。

这是我最近删除的问题的重新发布。我在最后一个例子中误解了我的代码。正确的例子是:

我有一个字典,其列表类似于:

dic = [
  {
    'name': 'john',
    'items': ['pants_1', 'shirt_2','socks_3']
  },
  {
    'name': 'bob',
    items: ['jacket_1', 'hat_1']
  }
] 

我使用.append同时使用'name''items',将dic值添加到两个新列表中:

for x in dic:
    dic_name.append(dic['name'])
    dic_items.append(dic['items'])

我需要使用'_'作为分隔符来拆分项目值,因此我还要通过执行以下操作来拆分值:

name, items = [i if i is None else i.split('_')[0] for i in dic_name],
              [if i is None else i.split('_')[0] for i in chain(*dic_items)])
如果没有值,则使用

None。这为我提供了name, items的新列表,并使用了分隔符。无视我使用' _'在此示例中拆分名称。

当我使用此功能时,nameitem的索引不再匹配。我是否需要在数组中创建列出的项目以匹配name索引,如果是,如何?

理想情况下,我希望name[0](约翰)也匹配items[0](作为列表中项目的数组,所以裤子,衬衫,袜子)。这种方式,当我引用0的索引name时,它还会将items的所有值都抓取为索引0。与bob [1]使用的索引相同,它应该与具有相同索引的项匹配。

@ avinash-raj,感谢您的耐心等待,因为我不得不更新我的问题,以便更加密切地反映我正在使用的代码。

4 个答案:

答案 0 :(得分:2)

需要字典的列表,因为重复的密钥nameitems会被覆盖:

items = [[i.split('_')[0] for i in d['items']] for d in your_list]
names = [d['name'] for d in your_list] # then grab names from list

或者,您可以使用内置的zip方法和生成器在一行中执行此操作,如下所示:

names, items = zip(*((i['name'], [j.split('_')[0] for j in i['items']]) for i in dic))

答案 1 :(得分:2)

我正在阅读这些行之间的一点点,但是你是否试图折叠列表并删除字段名称,例如:

>>> dic = [{'name': 'john', 'items':['pants_1','shirt_2','socks_3']},
           {'name': 'bob', 'items':['jacket_1','hat_1']}]
>>> data = {d['name']: dict(i.split('_') for i in d['items']) for d in dic}
>>> data
{'bob': {'hat': '1', 'jacket': '1'},
 'john': {'pants': '1', 'shirt': '2', 'socks': '3'}}

现在数据直接相关,而是通过共同索引间接相关到2个列表。如果你希望字典拆分,你总是可以

>>> dic_name, dic_items = zip(*data.items())
>>> dic_name
('bob', 'john')
>>> dic_items
({'hat': '1', 'jacket': '1'}, {'pants': '1', 'shirt': '2', 'socks': '3'})

答案 2 :(得分:0)

来自教程中的Looping Techniques

for name, items in div.items():
    names.append(name)
    items.append(item)

如果您的字典是结构化的,那将会奏效

{'name':[item1]}

答案 3 :(得分:0)

的循环体中
for x in dic:
    dic_name.append(dic['name'])
    dic_items.append(dic['items'])

您可能希望访问xdic中的项目将依次分配到),而不是dic