繁体   English   中英

如何在 Python 中迭代列表(拆分的字符串) - for x in string

[英]How to iterate over a list (splitted string) in Python - for x in string

我有一个非常大的字符串,其中一次又一次地重复相同的模式。 我需要隔离此模式以将其填充到 SQL DB。 也就是说,每个模式重复代表数据库中的一行

所以我想我必须以某种方式将初始字符串拆分为多个字符串并围绕它包装一些迭代逻辑。

这是输入:

data = Foo|A|B|C|D|E|F|G|H|Foo|A|B|C|D|E|F|G|H|Foo[...]Foo[...]Foo

然后我使用data = msg.split("|")其拆分,输出:

data = Foo,A,B,C,D,E,F,G,H,Foo,A,B,C,D,E,F,G,H,Foo[...]Foo[...]Foo

现在我正在寻找一些基本可以迭代这个对象的逻辑,以将值AH分配给变量,并将它们推送到每个包含Foo的数据库中。

我目前尝试但没有成功:

If data[0] == Foo:
x = Foo

for x in data:
    Var1 = A
    Var2 = B
    Var3 = C
    [...]
    Var8 = H

..."use Django Model to push variables to DB"

代码运行没有错误,但只有data第一个Foo之后的第一个AH对象被填充到数据库中。

我什至接近一个聪明的解决方案,或者什么是实现它的正确方法?

++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++

更新:使用@user10987432 方法,我非常接近解决方案。

我现在从初始字符串中得到以下结构:

['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', '< >']
['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', '<>']
['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', '<>']
['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', '<>']
['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', '<>']
['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', '<>', '']

但似乎迭代不考虑update_or_create部分来用该数据填充数据库。

这是为什么?

            for key, group in groupby(data, key=lambda s: s != "historical_trades"):
                if key:
                    version = data[1]
                    DID = uuid.UUID(data[2])
                    accountNumber = int(data[3])
                    orderTicket = data[4]
                    orderOpenTime = data[5]
                    orderCloseTime = data[6]
                    orderType = float(data[7])
                    orderLots = float(data[8])
                    orderSymbol = data[9]
                    orderOpenPrice = float(data[10])
                    orderClosePrice = float(data[11])
                    orderStopLoss = float(data[12])
                    orderTakeProfit = float(data[13])
                    orderCommission = float(data[14])
                    orderSwap = float(data[15])
                    orderProfit = float(data[16])
                    orderComment = data[17]
                    print(list(group))   

                    # 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
                        }
                    )

你想要做什么并不是很明显 - 也许itertools.groupby是你正在寻找的?

from itertools import groupby

string = "Foo|A|B|C|D|Foo|Hello World|Test|Foo|E|F|G|H|I|J|K|Foo|1|2|3"

data = string.split("|")

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

输出:

['A', 'B', 'C', 'D']
['Hello World', 'Test']
['E', 'F', 'G', 'H', 'I', 'J', 'K']
['1', '2', '3']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM