迭代列表对象的JSON结构并查找下一个键

时间:2018-03-23 12:05:38

标签: python json python-3.x dictionary

我有一个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'}]

3 个答案:

答案 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