鱼C论坛

 找回密码
 立即注册
查看: 2386|回复: 6

[已解决]请问如何优化多次循环

[复制链接]
发表于 2020-2-4 09:17:21 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
对比2个列表内字典里的元素 把相同ID的情报赋予第一个里
dictList = [{‘ID’:1, ‘sex’: m}, ........{‘ID’:1000000, ‘sex’: m}]
tempList =  [{‘ID’:1, ‘info’: xxxx}, ........{‘ID’:1000000, ‘info’: xxxx}]
2列表长度不等,tempList有100万条完整数据,dictList内可能大概有95万条 用以下代码循环大概需要10分钟左右才能得出结果 请问有什么改善的方式吗?

for i in dictList:
    for k in tempList:
        if i[‘ID’] == k[‘ID’]:
            i[‘info’] = k[‘info’]
            tempList.remove(k)
            break

最佳答案
2020-2-4 10:34:07
双指针法:
  1. def merge(dstlist:list,srclist:list):
  2.     dstlist.sort(key=lambda x:x['id'])
  3.     srclist.sort(key=lambda x:x['id'])
  4.     i=j=0
  5.     while i<len(dstlist) and j<len(srclist):
  6.         dst_id,src_id=dstlist[i]['id'],srclist[j]['id']
  7.         if dst_id<src_id:
  8.             j+=1
  9.         elif dst_id>src_id:
  10.             i+=1
  11.         else:
  12.             dstlist[i].update(srclist[j])
  13.             i+=1
  14.             j+=1
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-4 09:37:43 From FishC Mobile | 显示全部楼层
sex   info是怎么个意思,不一致??
核心思想就是长列表覆盖短列表???
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-4 09:42:33 From FishC Mobile | 显示全部楼层
wp231957 发表于 2020-2-4 09:37
sex   info是怎么个意思,不一致??
核心思想就是长列表覆盖短列表???


从2个地方取的值 把id相同的dictList里填上另一个列表里的info情报 短列表取长列表里相同Id的info的值
dictList最后成为这样结果即可 [{‘ID’:1, ‘sex’: xx, ‘info’: xxx}.....]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-4 10:15:05 | 显示全部楼层
snowzkr 发表于 2020-2-4 09:42
从2个地方取的值 把id相同的dictList里填上另一个列表里的info情报 短列表取长列表里相同Id的info的值
...

给出点部分例子啊      自己构造太麻烦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-4 10:31:03 | 显示全部楼层
最好的办法就是更换一种数据结构。
这个列表里套字典的形式有点类似于json,推荐用pandas试一下
这里可以给你一个示例代码,当然也就额外需要去学一下pandas的Datarame的基本知识

  1. In [146]: a
  2. Out[146]: [{'id': 1, 'sex': 'm'}, {'id': 2, 'sex': 'f'}]

  3. In [147]: b
  4. Out[147]: [{'id': 1, 'info': 'xxxx'}]

  5. In [148]: x = pd.DataFrame(a)

  6. In [149]: y = pd.DataFrame(b)

  7. In [150]: x
  8. Out[150]:
  9.    id sex
  10. 0   1   m
  11. 1   2   f

  12. In [151]: y
  13. Out[151]:
  14.    id  info
  15. 0   1  xxxx

  16. In [152]: z = pd.merge(x,y,how='outer',on='id')

  17. In [153]: z
  18. Out[153]:
  19.    id sex  info
  20. 0   1   m  xxxx
  21. 1   2   f   NaN
复制代码

当然你也可以强行再转回字典,只是比较费劲
  1. In [154]: z.T.to_dict()
  2. Out[154]:
  3. {0: {'id': 1, 'sex': 'm', 'info': 'xxxx'},
  4. 1: {'id': 2, 'sex': 'f', 'info': nan}}
复制代码

其中的nan表示空数据的意思, np.nan
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-4 10:34:07 | 显示全部楼层    本楼为最佳答案   
双指针法:
  1. def merge(dstlist:list,srclist:list):
  2.     dstlist.sort(key=lambda x:x['id'])
  3.     srclist.sort(key=lambda x:x['id'])
  4.     i=j=0
  5.     while i<len(dstlist) and j<len(srclist):
  6.         dst_id,src_id=dstlist[i]['id'],srclist[j]['id']
  7.         if dst_id<src_id:
  8.             j+=1
  9.         elif dst_id>src_id:
  10.             i+=1
  11.         else:
  12.             dstlist[i].update(srclist[j])
  13.             i+=1
  14.             j+=1
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-4 12:18:30 From FishC Mobile | 显示全部楼层
本帖最后由 snowzkr 于 2020-2-4 12:38 编辑

先谢谢各位了.
用pandas那个方法速度提升了很多. 目前采用这种办法处理.
双指针也是过了 速度很快 但是有很多数据匹配不到…
※ 双指针if和elif里的i和j对调后匹配上了…速度比pandas更快...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-3-4 06:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表