如何在Python中迭代`groupBy`返回的对象?

如何在Python中迭代`groupBy`返回的对象?,python,Python,我将以下数据作为单个字符串输入: data = ['historical_trades', '1.00', '30e61aec-0f6e-4fa0-8c1b-eb07f9347c1f', '1925323', '343727655', '2019.11.14 21:24:01', '2019.11.14 21:24:01', '6', '0.01', '', '0.00000', '0.00000', '0.00000', '0.00000', '0.00', '0.00', '100000.0

我将以下数据作为单个字符串输入:

data = ['historical_trades', '1.00', '30e61aec-0f6e-4fa0-8c1b-eb07f9347c1f', '1925323', '343727655', '2019.11.14 21:24:01', '2019.11.14 21:24:01', '6', '0.01', '', '0.00000', '0.00000', '0.00000', '0.00000', '0.00', '0.00', '100000.00', '< >', 'historical_trades', '1.00', '30e61aec-0f6e-4fa0-8c1b-eb07f9347c1f', '1925323', '344377716', '2019.11.27 21:07:22', '2019.12.06 17:14:03', '1', '0.20', 'GBPUSD', '1.29118', '1.31069', '0.00000', '0.00000', '0.00', '4.24', '-353.20', '<>', 'historical_trades', '1.00', '30e61aec-0f6e-4fa0-8c1b-eb07f9347c1f', '1925323', '344377723', '2019.11.27 21:07:56', '2019.12.06 17:14:02', '1', '0.20', 'GBPUSD', '1.29117', '1.31070', '0.00000', '0.00000', '0.00', '4.24', '-353.57', '<>', 'historical_trades', '1.00', '30e61aec-0f6e-4fa0-8c1b-eb07f9347c1f', '1925323', '344377724', '2019.11.27 21:08:00', '2019.12.02 18:38:14', '1', '0.20', 'GBPUSD', '1.29118', '1.29444', '0.00000', '0.00000', '0.00', '2.36', '-58.87', '<>', 'historical_trades', '1.00', '30e61aec-0f6e-4fa0-8c1b-eb07f9347c1f', '1925323', '345200110', '2019.12.06 17:14:08', '2019.12.06 17:22:43', '0', '0.20', 'EURUSD', '1.10474', '1.10479', '0.00000', '0.00000', '0.00', '0.00', '0.91', '<>', 'historical_trades', '1.00', '30e61aec-0f6e-4fa0-8c1b-eb07f9347c1f', '1925323', '345200125', '2019.12.06 17:14:21', '2019.12.06 17:22:45', '0', '4.00', 'EURUSD', '1.10483', '1.10479', '0.00000', '0.00000', '0.00', '0.00', '-14.48', '<>', '']
现在,我如何访问
groupby
返回的对象并对其进行迭代以填充数据库

工作解决方案:

我尝试将@Tobi的解决方案改编成我的代码,现在它可以正常工作了

            for key, group in groupby(data, key=lambda s: s != "live_trades"):
                if key:

                    trades = list(group)
                    print(trades)

                    for data in trades:

                        version = trades[0]
                        print(version)
                        DID = uuid.UUID(trades[1])
                        accountNumber = int(trades[2])
                        print(accountNumber)
                        orderTicket = trades[3]
                        print(orderTicket)
                        orderOpenTime = trades[4]
                        orderCloseTime = trades[5]
                        orderType = float(trades[6])
                        orderLots = float(trades[7])
                        orderSymbol = trades[8]
                        orderOpenPrice = float(trades[9])
                        orderClosePrice = float(trades[10])
                        orderStopLoss = float(trades[11])
                        orderTakeProfit = float(trades[12])
                        orderCommission = float(trades[13])
                        orderSwap = float(trades[14])
                        orderProfit = float(trades[15])
                        orderComment = trades[16]
                        print(orderTicket)


                        # convert dateTime strings into Python comfort dateTime

                        orderOpenTime = datetime.strptime(orderOpenTime, '%Y.%m.%d %H:%M:%S')
                        orderCloseTime = datetime.strptime(orderCloseTime, '%Y.%m.%d %H:%M:%S')

                        # push the manipulated data to the PostgreSQL DB using `Trades` model
                        # If DID exists, update values, if not create new entry

                        obj, created = Trades.objects.update_or_create(
                            orderTicket=orderTicket,
                            defaults={
                                'version': version,
                                'DID': DID,
                                'accountNumber': accountNumber,
                                'orderTicket': orderTicket,
                                'orderOpenTime': orderOpenTime,
                                'orderCloseTime': orderCloseTime,
                                'orderType': orderType,
                                'orderLots': orderLots,
                                'orderSymbol': orderSymbol,
                                'orderOpenPrice': orderOpenPrice,
                                'orderClosePrice': orderClosePrice,
                                'orderStopLoss': orderStopLoss,
                                'orderTakeProfit': orderTakeProfit,
                                'orderCommission': orderCommission,
                                'orderSwap': orderSwap,
                                'orderProfit': orderProfit,
                                'orderComment': orderComment
                            }
                        )

以下几点应该可以很好地发挥作用:

for data in group:
    version = data[0]
    ...
有两点需要注意:

  • 索引从
    0
    开始,因此数据中的第一个元素是
    [0]
    ,第二个元素是
    [1]
    ,依此类推
  • 不仅来自
    groupby
    的结果,而且其中的各个组都是迭代器,因此一旦您使用它们,例如使用
    print(list(group))
    ,它们就会耗尽(我想这是您尝试循环时的问题)

    相反,您可以
    打印内部循环中的当前组,或收集列表中的所有组,即
    group=list(group)

此外,您可以使用
zip
数据中的所有字段直接与
数据中的正确名称和类型组合,而不是将它们存储在17个不同的变量中,然后将它们写回字典。(仅当您需要
数据中的所有字段时才起作用,但这里似乎就是这样。)

字段=('version'、'DID'、'accountNumber'、'orderTicket'、'orderOpenTime',
“orderCloseTime”、“orderType”、“orderLots”、“orderSymbol”、“orderOpenPrice”,
“orderClosePrice”、“orderStopLoss”、“orderTakeProfit”、“orderCommission”,
“订单交换”、“订单利润”、“订单评论”)
类型=(str,uuid.uuid,int,str,str,str,float,float,str,float,float,
浮动,浮动,浮动,浮动,str)
默认值={f:t(d)表示zip中的f、t、d(字段、类型、数据)}
#{'orderSwap':0.0,'orderCloseTime':'2019.12.06 17:22:45','orderComment':'',
#“orderTakeProfit”:0.0,“账号”:1925323,“DID”:UUID('30e61aec-0f6e-4fa0-8c1b-eb07f9347c1f'),
#“orderType”:0.0,“orderCommission”:0.0,“orderLots”:4.0,“orderOpenTime”:2019.12.06 17:14:21,
#“orderSymbol”:“EURUSD”,“orderOpenPrice”:1.10483,“version”:“1.00”,“orderProfit”:-14.48,
#'orderStopLoss':0.0,'orderClosePrice':1.10479,'orderTicket':'345200125'}

您只使用硬编码的
数据[1]
…!?非常感谢superduper的回复。然而,我仍然没有完全理解。那么,一旦返回的组被消耗(即使使用打印),它就耗尽了吗?因此,您建议在对其进行任何操作之前将其存储在变量中?我试图实现您的解决方案,但它现在在循环时返回几个字符串索引超出范围的错误,为什么?还有,什么样的数据结构/对象是一个组,二维数组?该组(在本例中)是一种二维数组:它是根据
函数相等的所有条目的迭代器,在本例中,这些条目是列表本身(数据
行)
for data in group:
    version = data[0]
    ...
>>> k, g = next(groupby([1,1,1,2,2,2]))
>>> list(g) # prints fine at first...
[1, 1, 1]
>>> list(g) # ... nothing happens in the loop afterwards?
[]
fields = ('version','DID','accountNumber','orderTicket','orderOpenTime',
        'orderCloseTime','orderType','orderLots','orderSymbol','orderOpenPrice',
        'orderClosePrice','orderStopLoss','orderTakeProfit','orderCommission',
        'orderSwap','orderProfit','orderComment')

types = (str,uuid.UUID,int,str,str,str,float,float,str,float,float,float,
        float,float,float,float,str)

defaults = {f: t(d) for f,t,d in zip(fields, types, data)}
#{'orderSwap': 0.0, 'orderCloseTime': '2019.12.06 17:22:45', 'orderComment': '<>', 
# 'orderTakeProfit': 0.0, 'accountNumber': 1925323, 'DID': UUID('30e61aec-0f6e-4fa0-8c1b-eb07f9347c1f'), 
# 'orderType': 0.0, 'orderCommission': 0.0, 'orderLots': 4.0, 'orderOpenTime': '2019.12.06 17:14:21', 
# 'orderSymbol': 'EURUSD', 'orderOpenPrice': 1.10483, 'version': '1.00', 'orderProfit': -14.48, 
# 'orderStopLoss': 0.0, 'orderClosePrice': 1.10479, 'orderTicket': '345200125'}