[英]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.