RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1473122
Accepted
Duracell
Duracell
Asked:2022-12-02 01:31:28 +0000 UTC2022-12-02 01:31:28 +0000 UTC 2022-12-02 01:31:28 +0000 UTC

快速访问元素索引

  • 772

有一张由字典组成的表格,一个例子:

testList
[
    {'el1':{'x': 0, 'y': 0, 'z': 0}},
    {'el2':{'x': 1, 'y': 1, 'z': 1}},
    {'el3':{'x': 2, 'y': 2, 'z': 3}}
 ]

这样一张表中有 400k+ 个字典。我们需要一种快速获取工作表元素索引号的方法。例如:您需要其中为 的工作表元素的索引'x'号0。我首先想到的是“半除法”类型的递归搜索,现在我不记得这个算法到底叫什么了。其实这个方法是实施的,结果也是安排的。但我想知道我想出了一辆自行车。也许 中有一个现成的功能list,可以让你快速搜索字典列表中的索引,或者你甚至可以使用“切片”并且速度方面的结果是一样的?

python
  • 3 3 个回答
  • 41 Views

3 个回答

  • Voted
  1. Best Answer
    SergFSM
    2022-12-02T16:20:21Z2022-12-02T16:20:21Z

    搜索,或者更确切地说是过滤,使用切片在 pandas 中实现。对于像您这样大的数据集,尝试使用 pandas 可能是有意义的。尽管此解决方案需要额外的内存:

    import pandas as pd
    
    testList = [
        {'el1':{'x': 0, 'y': 0, 'z': 0}},
        {'el2':{'x': 1, 'y': 1, 'z': 1}},
        {'el3':{'x': 2, 'y': 2, 'z': 3}},
        {'el4':{'x': 0, 'y': 1, 'z': 3}}]  # <--- добавлен
    
    df = pd.concat(map(pd.Series,testList)).apply(pd.Series).reset_index()
    
    def get_idxs(col,val,df=df):
        return df.loc[df[col]==val].index.tolist()
    
    get_idxs('z',3)  # [2, 3]
    get_idxs('x',0)  # [0, 3]
    get_idxs('y',1)  # [1, 3]
    

    如果这一行被替换为:

    df = pd.concat(map(pd.Series,testList)).apply(pd.Series)
    

    我们得到以下结果:

    get_idxs('x',0)  # ['el1', 'el4']
    get_idxs('y',1)  # ['el2', 'el4']
    
    • 3
  2. CrazyElf
    2022-12-02T16:57:24Z2022-12-02T16:57:24Z

    如果这个结构体的内容没有变化,有很多次调用它,而且x没有重复,那么你可以预先建立一个新的字典,键等于值x,并立即从中取值。同时,不会花费空间来存储元素本身——对象的引用,而不是对象的副本,进入字典。所以附加字典中的位置将只用在键和链接上。

    testList =\
    [
        {'el1':{'x': 0, 'y': 0, 'z': 0}},
        {'el2':{'x': 1, 'y': 1, 'z': 1}},
        {'el3':{'x': 2, 'y': 2, 'z': 3}}
    ]
    
    testListX = {next(iter(x.values()))['x']: x for x in testList}
    print(testListX[1])
    

    结论:

    {'el2': {'x': 1, 'y': 1, 'z': 1}}
    

    如果x它们可以重复,那么代码会稍微复杂一些——您需要存储的不是元素,而是元素列表,但无论如何字典仍然是访问时间最快的解决方案O(1)。

    • 2
  3. Stanislav Volodarskiy
    2022-12-02T17:25:32Z2022-12-02T17:25:32Z

    建立一个索引——一个映射一个值和一个索引列表的字典。建立一次索引并多次使用它是有意义的。与原来的列表相比,不会占用太多内存:

    def makeIndex(list_, key):
        d = {}
        for i, item in enumerate(list_):
            for v in item.values():
                d.setdefault(v.get(key), []).append(i)
        return d
    
    
    testList = [
        {'el1':{'x': 0, 'y': 0, 'z': 0}},
        {'el2':{'x': 1, 'y': 1, 'z': 1}},
        {'el3':{'x': 2, 'y': 2, 'z': 3}}
    ]
    
    
    import pprint
    
    
    for key in 'axyz':
        pprint.pprint((key, makeIndex(testList, key)))
    
    $ python indices.py
    ('a', {None: [0, 1, 2]})
    ('x', {0: [0], 1: [1], 2: [2]})
    ('y', {0: [0], 1: [1], 2: [2]})
    ('z', {0: [0], 1: [1], 3: [2]})
    
    • 1

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5