【问题标题】:Python searching a Json with key valuePython搜索具有键值的Json
【发布时间】:2016-11-21 15:05:38
【问题描述】:

我有一个 JSON 文件,我正在尝试使用值(而不是键)进行搜索。 Python中是否有内置函数可以做到这一点?

 [["2778074170846781111111110", "a33104eb1987bec2519fe051d1e7bd0b4c9e4875"],
  ["2778074170846781111111111", "f307fb3db3380bfd27901bc591eb025398b0db66"]]

我想到了这种方法。将文件加载到列表中并开始搜索。有没有更有效的方法?

def OptionLookUp(keyvalue):
    with open('data.json', 'r') as table:
        x= json.loads(table)

【问题讨论】:

  • 这是普通的二维列表(不是字典),所以你没有键 - 只有值。你想找到什么?使用 for 循环检查每一行。
  • 正如 furas 所说,它是二维列表 (python),或者当谈到 JSON 时,它是二维数组。这是键值 JSON:{ 'key': 'value' }。正如 furas 所问,您传递函数的“键值”示例是什么?
  • 当然,但它仍然是有效的 JSON。你可以在这里查看jsonlint.com
  • 请说明(带有输入/输出示例)您所说的“搜索”是什么意思?
  • input = a33104eb1987bec2519fe051d1e7bd0b4c9e4875 Output = 2778074170846781111111110 我已经这样做了 def OptionLookUp(key): with open('data.json', 'r') as table: x= json.load(table) for i in x: if (i[1] == key): print i

标签: python json search


【解决方案1】:

在您编辑之后,我可以说没有比将您的 JSON 转换为 python 二维列表并循环遍历每个节点并将第二个字段与您的“键值”进行比较更快/更有效的方法。

编辑:更快/更高效

【讨论】:

  • 谢谢!。这就是我想知道的:)
【解决方案2】:
your_dict = {'a': 1, 'b': 2, 'c': 'asd'}  # the dictionary
your_value = 'asd'  # the value to look for
[elem for elem in your_dict.iteritems() if elem[1] == 'asd']  # look for entry with value == your_value
Output: [('c', 'asd')]

编辑:

列表:

your_list = [['a', 1], ['b', 2], ['c', 'asd']]  # the list
your_value = 'asd'  # the value to look for
[elem for elem in your_list if elem[1] == 'asd']  # look for element with value == your_value
Output: [('c', 'asd')]

【讨论】:

  • 操作的数据是列表的列表,而不是字典。
【解决方案3】:

我假设您正在寻找与给定值关联的键(或多个键)。

如果您的数据被保证是(键、值)对的列表,这取决于 1/ 数据的容量和 2/ 您必须在同一数据集上执行的查找次数,您可以执行简单的顺序搜索:

def slookup(lst, value):
    return [k for k, v in lst if v == value]

或者建立一个反向索引然后查找索引:

import defaultdict
def index(lst):
    d = defaultdict(list)
    for k, v in lst:
        d[v].append(k)
    return d

rindex = index(lst)
print rindex.get(someval)
print rindex.get(someotherval)

只有当您在同一个数据集上进行大量查找时,第二个解决方案才有意义,显然......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-07
    • 2013-09-25
    • 2022-01-20
    • 2017-03-30
    • 1970-01-01
    • 2015-06-07
    • 2020-06-26
    • 2017-08-31
    相关资源
    最近更新 更多