2014-10-02 109 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]