为字典中的任何键找到匹配值的最Pythonic方法是什么?

时间:2018-07-15 16:57:12

标签: python dictionary list-comprehension dictionary-comprehension

这是我的字典结构:

{
    "432701228292636694" : {
        "432739261603905537" : {
            "channels" : {
                "LoL Duos" : {
                    "capacity" : 2,
                    "rooms" : [
                        "432741328477093889"
                    ]
                },
                "LoL Quads" : {
                    "capacity" : 4,
                    "rooms" : [
                        "432741635852599297"
                    ]
                },
                "LoL Teams" : {
                    "capacity" : 5,
                    "rooms" : [
                        "467708831695110154"
                    ]
                },
                "LoL Trios" : {
                    "capacity" : 3,
                    "rooms" : [
                        "432741537890304030",
                        "468096902055985152"
                    ]
                }
            },
            "perms" : {
                "453625621604728839" : {
                    "read_messages" : false
                },
                "461654834689474560" : {
                    "read_messages" : false
                }
            }
        },
        "432739461475074049" : {
            "channels" : {
                "FN Duos" : {
                    "capacity" : 2,
                    "rooms" : [
                        "432740789660155904"
                    ]
                },
                "FN Squads" : {
                    "capacity" : 4,
                    "rooms" : [
                        "432740857268142081"
                    ]
                },
                "FN Trios" : {
                    "capacity" : 3,
                    "rooms" : [
                        "467707010746417172"
                    ]
                }
            },
            "perms" : {
                "453625621604728839" : {
                    "read_messages" : false
                },
                "461654872815697931" : {
                    "read_messages" : false
                }
            }
        },
        "436634548051378186" : {
            "channels" : {
                "OW Duos" : {
                    "capacity" : 2,
                    "rooms" : [
                        "436636544229441567"
                    ]
                },
                "OW Quads" : {
                    "capacity" : 4,
                    "rooms" : [
                        "436636615167705089"
                    ]
                },
                "OW Teams" : {
                    "capacity" : 5,
                    "rooms" : [
                        "467707823954984971"
                    ]
                },
                "OW Trios" : {
                    "capacity" : 3,
                    "rooms" : [
                        "436636575036866570"
                    ]
                }
            },
            "perms" : {
                "453625621604728839" : {
                    "read_messages" : false
                },
                "461654908329000972" : {
                    "read_messages" : false
                }
            }
        }
    }
}

我想要做的是检查字符串是否与任何rooms的值匹配。我发现这样做的方式很乱:

    for category_id in self.gaming_db[server.id]:
        channel_names = self.gaming_db[server.id][category_id]['channels']
        for channel_name in channel_names:
            room_ids.extend([server.get_channel(x) for x in self.gaming_db[server.id][category_id]['channels'][channel_name]['rooms']])

这是如果您假设self.gaming_db是此词典。有没有更Python化的方式来做到这一点?我认为这与使用Lambda进行列表理解有关吗?到目前为止,我真的还不太了解。

2 个答案:

答案 0 :(得分:0)

您可以使用递归:

train = pd.read_csv('/Desktop/test.csv')
X = train.iloc[:, 4]
y = train.iloc[:, 4:5]

svr_rbf = SVR(kernel='rbf', C=1e3, gamma=0.1)
y_rbf = svr_rbf.fit(X, y).predict(X)

lw = 2
plt.scatter(X, y, color='darkorange', label='data')
plt.plot(X, y_rbf, color='navy', lw=lw, label='RBF model')
plt.xlabel('data')
plt.ylabel('target')
plt.title('Support Vector Regression')
plt.legend()
plt.show()

输出:

import json
def search(d, _search, _key='rooms'):
  return any(search(b, _search) if isinstance(b, dict) else _search in [[], b][a== _key] 
     for a, b in d.items())

print(search(json.loads(source_dict), '436636544229441567'))

答案 1 :(得分:-1)

使用递归生成器,我们可以浏览字典,因此您可以根据其结构自定义字典的浏览方式

def walk(d):
    """Lazily walk down recursive dictionary."""
    for k,v in d.items():
        if isinstance(v, dict):
             yield from walk(v)
        else:
             yield (k, v)

然后,我们可以使用所说的助行器进行搜索:

def search(d, room_id):
    """Return a bool reprenting if a room contains given id."""
    for k, v in walk(d):
        if k=="rooms" and room_id in v:
            return True
    return False

现在,让我们对其进行测试:

room_id = "436636575036866570"
result = search(data, room_id)
>>> True
相关问题