我有一个Json列表,我想从给定的键打印所有键,直到字典结束。但是我写的代码非常复杂。如何以较低的复杂性做到这一点? 我正在使用 Python 3
dictionary = [{"a": "1"}, {"b": "2"}, {"c": "3"}, {"d": "4"}]
try:
for token in dictionary:
if "b" in list(token.keys())[0]:
new_dict = dictionary[len(list(token.keys())[0]):]
for i in new_dict:
print(new_dict[len(list(i.keys())[0]):])
break
else:
print("Inception")
except Exception as error:
print(str(error))
渴望
输入: b
输出: c,d
我的输出:
Inception
[{'c': '3'}, {'d': '4'}]
[{'c': '3'}, {'d': '4'}]
[{'c': '3'}, {'d': '4'}]
答案 0 :(得分:5)
使用itertools.dropwhile()
跳过所有没有from itertools import dropwhile
filtered = dropwhile(lambda t: 'b' not in t, dictionary)
next(filtered) # skip the dictionary with `b` in it.
for token in filtered:
print(token)
密钥的词典:
filtered = dropwhile(lambda t: 'b' not in t, dictionary)
next(filtered) # skip the dictionary with `b` in it.
for token in filtered:
print(*token, sep='\n')
这会在第一个字典后打印所有字典。如果您只需要打印密钥,请明确这样做:
token
这会将键打印在不同的行上;如果只有一个键,那就是为每个list(dict.keys())[0]
字典打印的所有内容。)
作为旁注:您真的不想使用key in dictobject
。在Python 3.6之前,字典没有设置顺序(而不是being subject to insertion and deletion history and the current random hash seed),所以如果你有多个键,你将得到的是一个赌博。您要做的就是查看是否存在密钥,因此请使用next(iter(dictobject))
成员资格测试。
要从每个字典中获取第一个密钥,我会使用first_key = next(iter(dictobject))
,避免创建列表:
av_frame_alloc()
如果我有单键词典,我只会使用它。我也避免在这种情况下使用词典;也许你真的想要使用有序字典(在Python< 3.6中,使用collections.OrderedDict()
,否则使用regular dict
type)。
答案 1 :(得分:2)
这是一种方式。想法是找到具有所需键的字典索引。然后相应地过滤您的列表。
@socketio.on("get initial data")
def on_initial_data(ticker):
"""
Emits the initial stock data for given ticker.
:param str ticker: ticker of stock to query.
"""
socketio.emit("initial data",
[i.serialize for i
in Stock.query.filter_by(
ticker=ticker,
time_stamp=db.func.date(Stock.time_stamp) == date.today()).order_by(Stock.time_stamp)],
room=request.sid)
答案 2 :(得分:0)
您可以按照以下方式重新编写代码,以获得所需的结果。
found = False
for data in dictionary:
if found:
print(list(data.keys())[0])
if 'b' in data.keys():
found = True