这是我的字典结构:
{
"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进行列表理解有关吗?到目前为止,我真的还不太了解。
答案 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