鱼C论坛

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

关于自动创建列表以及添加元素的疑问.

[复制链接]
发表于 2019-6-6 15:21:30 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 wrpython 于 2019-6-6 15:24 编辑

大家好,我有一串字典数据需要按照要求分类并暂时存放在列表里,自动创建列表的部分已经完成了,但是不知道该怎么存放到列表中,希望各位大大指点一下,谢谢。

数据的形式如下:
{'symbol':symbol,'price':price,'size':size,'time':mkttime}
具体如下:
{'symbol': 'EFII.NQ', 'price': '36.87', 'size': 100,  'time': '09:11:54'}
{'symbol': 'ICL.NY', 'price': '5.50', 'size': 900,  'time': '09:26:43'}
{'symbol': 'SAR.NY', 'price': '24.44', 'size': 1,  'time': '09:17:51'}
{'symbol': 'GRFS.NQ', 'price': '19.75', 'size': 100, 'time': '09:17:58'}
因实际数据量很大,所以不便放上来


如果symbol从来没有出现过,需要为这个symbol创建一个字典和列表:
这一部分的工作我已经完成,我定义了一个空集合 set1,如果symbol没有出现过,就同时创建一个字典和列表,具体代码如下:
  1. set1 = set()
  2. symboldict = {}

  3. if symbol not in set1:
  4.     set1.add(symbol)
  5.     symboldict[symbol] = {'symbol':symbol,'price':price,'size':size,'time':mkttime}
  6.     i = [symboldict[symbol]]
  7.     #print(symboldict[symbol])
  8.     #print(i)
复制代码
这部分内容我print之后显示的结果是正确的,确实创建了需要的字典和列表并且没有重复的

如果symbol已经出现过,那么就将数据添加到定义好的列表中,这一部分出现了问题,我的代码如下:

  1. if symbol in set1:
  2.     i.append(symboldict[symbol])
  3.     if len(i) > 10:
  4.         i.pop(0)
  5.         if i[1]['size'] == 100:
  6.             print(i)
复制代码
预期的效果应该是这样的,列表中的symbol应该都是同一个symbol:
[{'symbol': 'CNXM.NY', 'price': '15.50', 'size': 100, 'mmid': 'T', 'time': '09:20:12'}, {'symbol': 'CNXM.NY', 'price': '15.50', 'size': 100, 'mmid': 'T', 'time': '09:20:12'}, {'symbol': 'CNXM.NY', 'price': '4.39', 'size': 100, 'mmid': 'Z', 'time': '09:08:28'}]

[{'symbol': 'RBZ.NQ', 'price': '4.39', 'size': 100, 'mmid': 'Z', 'time': '09:08:28'}, {'symbol': 'RBZ.NQ', 'price': '15.50', 'size': 100, 'mmid': 'T', 'time': '09:20:12'}, {'symbol': 'RBZ.NQ', 'price': '15.50', 'size': 100, 'mmid': 'T', 'time': '09:20:12'}]


但实际的效果却是这样的:

[{'symbol': 'RBZ.NQ', 'price': '4.39', 'size': 129, 'mmid': 'Z', 'time': '09:08:28'}, {'symbol': 'CNXM.NY', 'price': '15.50', 'size': 10, 'mmid': 'T', 'time': '09:20:12'}, {'symbol': 'RBZ.NQ', 'price': '4.39', 'size': 129, 'mmid': 'Z', 'time': '09:08:28'}]

[{'symbol': 'ICL.NY', 'price': '5.50', 'size': 900, 'mmid': 'P', 'time': '09:26:43'}, {'symbol': 'AMCX.NQ', 'price': '59.30', 'size': 10, 'mmid': 'P', 'time': '09:28:10'}, {'symbol': '': 'AZRX.NQ', 'price': '5.50', 'size': 900, 'mmid': 'P', 'time': '09:26:43'}]


字典元素并没有按照名字分别放入应该在的列表中,而是混乱的,请问为什么会这样?应该如何修改才能让数据正确的加入列表?谢谢!










小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-6-6 15:40:29 | 显示全部楼层
得有测试数据  得有期望结果
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-6-6 19:41:05 | 显示全部楼层
如果直接数据都是想最开始那样的,一串字典,先把每个字典用列表存起来,对这个列表做遍历就好了
直接写循环和过滤条件就好了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-6-6 21:33:39 | 显示全部楼层
花了90多分钟写一下,好菜啊我,你看看代码。
  1. # 整体代码我是按照逻辑思路写的,先怎么样再怎么样,肯定代码很粗糙,运行速度还有内存可以优化很多很多。
  2. dict_list = [{"symbol":1},{"symbol":1},{"symbol":2},{"symbol":3},{"symbol":4},{"symbol":2},{"symbol":3}]
  3. symbols_list = []# 创建一个空列表来存放所有字典第一项的值
  4. for each_dict in dict_list:
  5.     symbols_list.append(each_dict['symbol'])
  6. result_list = []# 创建一个空列表存放结果,二维的列表,相同值的字典放一个列表
  7. for i in range(len(set(symbols_list))):# 初始化结果列表,重复添加空列表进入列表。(回过头看代码,其实这里的初始化才导致下面的麻烦)
  8.     result_list.append([])
  9. i = 0# 一个控制变量
  10. while 1:# 这里循环了for都需要循环len(result_list)次,其实只要遍历一次,把初始化和遍历放一起执行,但是思路已经开始了,不能打断,先由结果,再来优化。PS:注释是后面补齐的
  11.     for each_dict in dict_list[:]:# 这里的切片很有意味,这里花了我好多时间琢磨,也是初始化带来的“恶果”
  12.         if result_list[i] == []:# 如果是列表是空的,直接把第一个遇见的字典存进去
  13.             result_list[i].append(each_dict)
  14.             dict_list.remove(each_dict)# 当然每次循环完一次,就要把这个从字典中去掉
  15.         else:
  16.             if each_dict['symbol'] == result_list[i][0]['symbol']:# 字典第一项的值相等的继续存进去
  17.                 result_list[i].append(each_dict)
  18.                 dict_list.remove(each_dict)# 当然每次循环完一次,就要把这个从字典中去掉
  19.     i += 1# 每次for循环结束,控制变量i加1
  20.     if i >= len(result_list):# 控制跳出while循环的语句
  21.         break
  22. print(result_list)
  23. # 封装成函数或者类才是最后的结果,这只是核心思路是这样代码实现
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-6-7 06:43:46 | 显示全部楼层
1.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-6-7 06:45:53 | 显示全部楼层
本帖最后由 kaohsing 于 2019-6-7 07:54 编辑

试试,
import re

raw_data = [{'symbol': 'CNXM.NY', 'price': '15.50'},
            {'symbol': 'CNXM.NY', 'price': '15.50'},
            {'symbol': '789', 'price': '15.50'},
            {'symbol': 'CNXM.NY', 'price': '4.39'},
            {'symbol': 'RBZ.NQ', 'price': '14.39'},     
            {'symbol': 'RBZ.NQ', 'price': '15.50'},
            {'symbol': 'RBZ.NQ', 'price': '15.50'},
            {'symbol': '123', 'price': '15.50'}, {'symbol': '789', 'price': '10.00'},
            ]
dic={}

for d in set(re.findall(r"symbol': '(.*?)'", str(raw_data), re.M)):
    res = re.findall(r"{'symbol': '"+d+".*?'}", str(raw_data), re.M)
    dtemp= []
    for i in res:
        dtemp.append(eval(i))
    dic[d]= dtemp
   
for d in dic.values():
    print(d)
'''
[{'symbol': 'RBZ.NQ', 'price': '14.39'}, {'symbol': 'RBZ.NQ', 'price': '15.50'}, {'symbol': 'RBZ.NQ', 'price': '15.50'}]
[{'symbol': 'CNXM.NY', 'price': '15.50'}, {'symbol': 'CNXM.NY', 'price': '15.50'}, {'symbol': 'CNXM.NY', 'price': '4.39'}]
[{'symbol': '123', 'price': '15.50'}]
[{'symbol': '789', 'price': '15.50'}, {'symbol': '789', 'price': '10.00'}]


'''
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-6-7 12:15:39 | 显示全部楼层
datas = [{'symbol': 'CNXM.NY', 'price': '1'},
         {'symbol': 'CNXM.NY', 'price': '2'},
         {'symbol': '789', 'price': '15.50'},
         {'symbol': 'CNXM.NY', 'price': '3'},
         {'symbol': 'RBZ.NQ', 'price': '14.39'},
         {'symbol': 'RBZ.NQ', 'price': '15.50'},
         {'symbol': 'RBZ.NQ', 'price': '15.50'},
         {'symbol': '123', 'price': '15.50'},
         {'symbol': '789', 'price': '10.00'},
         ]

datas.sort(key=lambda i: i['symbol'])
sym = datas[0]['symbol']
d = []
k = 0
for index, item in enumerate(datas):
    sy=item['symbol']
    if sym is not sy:
        d.append([datas[i] for i in range(k, index)])
        sym = item['symbol']
        k=index
    if index==len(datas)-1:
        d.append([datas[i] for i in range(k, index)])
else:
    for dd in d:
        print(dd)
'''
[{'symbol': '123', 'price': '15.50'}]
[{'symbol': '789', 'price': '15.50'}, {'symbol': '789', 'price': '10.00'}]
[{'symbol': 'CNXM.NY', 'price': '1'}, {'symbol': 'CNXM.NY', 'price': '2'}, {'symbol': 'CNXM.NY', 'price': '3'}]
[{'symbol': 'RBZ.NQ', 'price': '14.39'}, {'symbol': 'RBZ.NQ', 'price': '15.50'}, {'symbol': 'RBZ.NQ', 'price': '15.50'}]




'''
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-16 06:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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