2014-10-02 110 views
1

我想获取包含列表和字典的嵌套字典中所有键的列表。获取嵌套字典中所有键的列表

我目前有这个代码,但它似乎缺少向列表中添加一些键,而且重复也添加了一些键。

keys_list = [] 
def get_keys(d_or_l, keys_list): 
    if isinstance(d_or_l, dict): 
     for k, v in iter(sorted(d_or_l.iteritems())): 
      if isinstance(v, list): 
       get_keys(v, keys_list) 
      elif isinstance(v, dict): 
       get_keys(v, keys_list) 
      else: 
       keys_list.append(k) 
    elif isinstance(d_or_l, list): 
     for i in d_or_l: 
      if isinstance(i, list): 
       get_keys(i, keys_list) 
      elif isinstance(i, dict): 
       get_keys(i, keys_list) 
    else: 
     print "** Skipping item of type: {}".format(type(d_or_l)) 
    return keys_list 

这只是一个空的列表,并用键填充它。 d_or_l是一个变量,并将原始字典与它进行比较。

+1

你想要做什么如果在不同的目录中有相同的密钥? – 2014-10-02 18:23:06

+0

如果有相同的密钥,则无关紧要。我希望这样做是为了比较目的,在不同的字典中使用不同的密钥进行比较。取出重复值不会很好。 – GatesOfDelirium 2014-10-02 18:39:57

回答

1

就目前而言,您的代码会忽略导致listdict值的键。删除第一个for循环中的else块,无论值是什么,都要添加密钥。

keys_list = [] 
def get_keys(d_or_l, keys_list): 
    if isinstance(d_or_l, dict): 
     for k, v in iter(sorted(d_or_l.iteritems())): 
      if isinstance(v, list): 
       get_keys(v, keys_list) 
      elif isinstance(v, dict): 
       get_keys(v, keys_list) 
      keys_list.append(k) # Altered line 
    elif isinstance(d_or_l, list): 
     for i in d_or_l: 
      if isinstance(i, list): 
       get_keys(i, keys_list) 
      elif isinstance(i, dict): 
       get_keys(i, keys_list) 
    else: 
     print "** Skipping item of type: {}".format(type(d_or_l)) 
    return keys_list 

get_keys({1: 2, 3: 4, 5: [{7: {9: 1}}]}, keys_list)回报[1, 3, 9, 7, 5]

为避免重复,你可以使用一个set datatype,而不是list

+0

不适用于带有列表和词典的词典,例如{1:2,3:4,5:[{7:{9:1}}]} – pm007 2014-10-02 18:53:10

+0

@ pm7它适用于我的环境,我会发布我使用的完整代码。 – MackM 2014-10-02 19:02:23

+0

以前的版本没有工作,现在很好! – pm007 2014-10-02 19:04:45

4

这应该做的工作:

def get_keys(dl, keys_list): 
    if isinstance(dl, dict): 
     keys_list += dl.keys() 
     map(lambda x: get_keys(x, keys_list), dl.values()) 
    elif isinstance(dl, list): 
     map(lambda x: get_keys(x, keys_list), dl) 

为了避免您可以使用设置重复,例如:

keys_list = list(set(keys_list)) 

例测试用例:

keys_list = [] 
d = {1: 2, 3: 4, 5: [{7: {9: 1}}]} 
get_keys(d, keys_list) 
print keys_list 
>>>> [1, 3, 5, 7, 9]