在 json 字段中获取给定索引值之前的值



I have jsonfield

[{"0":"Z","1":"Y","2":"X","3":"W","4":"V"}].

我想获取Y前面的所有值,即X,W,V ...

i = 0
name = None
obj= Model.objects.get(Name=Request['Name'])
for key in obj:
currentPosition = key[str(i)]
i = i +1
if currentPosition == request['Position']:
continue
else:
sendData.append({"Position": currentPosition})

当我在请求中添加Y时,它也在获取Z的详细信息。

您可以使用列表推导式中的简单比较来获取"Y"前面的值:

>>> lst = [{"0":"Z","1":"Y","2":"X","3":"W","4":"V"}]
>>> [v for v in lst[0].values() if v < "Y"]
['X', 'W', 'V']

要获取键在"Y"键前面的值,您可以使用如下内容:

>>> idx = next(int(k) for k, v in lst[0].items() if v == "Y")
>>> [v for k, v in lst[0].items() if int(k) < idx]
['Z']

问题是你正在遍历字典中的每个键,如果它的位置是请求的位置(在本例中'1'对应于'Y'(,那么它会越过条目,在所有其他情况下,位置被附加到输出中。您可以做的最小更改是在到达请求的位置时将标志设置为 true,并将else替换为elif。下面给出了一个例子:

i = 0
none = None
obj = Model.objects.get(Name=Request['Name'])
flag = False
for key in obj:
currentPosition = key[str(i)]
i = i + 1
if currentPosition == reques['Position']:
flag = True
elif flag:
sendData.append({"Position" : currentPosition})

但是,上面的代码中有一些小问题,因为我假设obj字典。首先,字典中的键没有顺序,为了确保您的键被排序,您可以将obj:替换为sorted(obj):。其次,你有 currentPosition = key[str(i(],我认为这没有任何意义,因为如果 key 是字典中的一个键,那么key[str(i)]会引发异常,因为key是一个字符串,因此只有通过整数索引才有效。

我相信上述代码的更好版本如下(请注意,如果我的任何假设不正确,请在评论中告诉我,我可以进一步帮助您(:

obj = 模式

l.objects.get(Name=Request['Name'])
flag = False
for key in obj:
currentPosition = obj[key]
if currentPosition == request['Position']:
flag = True
elif flag:
sendData.append({'Position' : currentPosition})

最新更新