[英]How to set a variable to a specific column in a 2D list? Is it possible?
我正在嘗試創建一個“檢查記錄”function,它接受一個二維列表( ID
、 account
、 operation
、 amount
)並返回列表中有效或無效項目的數量。 這是基於設定的標准。 每個標准也有自己的 function,即驗證帳號是 function,它驗證帳號列表。
檢查記錄 function 然后將查看所有驗證函數的結果,並從完整的 2D 列表中刪除任何部分無效(返回 false)的項目。
完整列表看起來像這樣(對於上下文):
[['SYD123', '12823983', 'B', '150.00'], ['SYD127', '12823983', 'D', '20.00'], ['BHS115', '85849276', 'B', '1000.85'], ['BHS115', '76530902', 'B', '0.50'], ['BMT251', '49468141', 'W', '500.00'], ['DUB796', '50175864', 'W', '225.00'], ['WGA584', '34957765', 'D', '2500.00'], ['PMQ426', '34957765', 'B', '5700.00']]
並像這樣打印:
[列表格式][1]
我遇到的問題是我總是得到4
有效和0
個無效被返回。 不管實際有多少。 我認為問題是因為下面的變量只指向上面原始列表的一個元素。 我需要它們成為具有相關變量的整個列嗎? 如果這是錯誤的,請指出正確的方向。
我得到了什么:
Found (4) valid records.
Found (0) invalid records.
它認為有效的項目(都應該有效):
[['SYD127', '12823983', 'D', '20.00'], ['BHS115', '76530902', 'B', '0.50'], ['DUB796', '50175864', 'W', '225.00'], ['PMQ426', '34957765', 'B', '5700.00']]
問題代碼如下所示:
def check_records(log_records):
#THESE VARIABLES!!!!!
ID = log_records [0]
account = log_records [1]
operation = log_records [2]
amount = log_records [3]
#HERE!!!!!!
overall_valid = False
count = 0
#Use validate functions to get a valid or invalid record.
validate_atm_id(ID)
validate_account(account)
validate_operation(operation)
validate_amount(amount)
if validate_atm_id == True and validate_account == True and validate_operation == True and
validate_amount == True:
overall_valid = True
else:
overall_valid = False
for elem in log_records:
if overall_valid == False:
count + 1
log_records.remove(elem)
total_records = len(log_records)
invalid_records = count
valid_records = total_records - invalid_records
print(f"Found ({valid_records}) valid records.")
print(f"Found ({invalid_records}) invalid records.")
print(" ")
驗證函數之一(用於額外上下文):
def validate_account(account):
valid = False
#Account number must be 8 digits long.
if len(account) != 8:
valid = False
#Account number must only contain numbers.
elif not account.isdigit():
valid = False
#If the account number meets all requirments then it is valid.
else:
valid = True
if valid == True:
return True
elif valid == False:
return False
您可以使用列表理解創建類似列的結構:
ids = [i[0] for i in log_records] # assumming log_records is your full list
accounts = [i[1] for i in log_records]
operations = [i[2] for i in log_records]
amounts = [i[3] for i in log_records]
雖然我不建議這樣做,因為您要檢查的是單個記錄,如果您創建類似列的變量,您將不得不處理大量索引,這有點痛苦。
這也不必要地長:
if validate_atm_id == True and validate_account == True and validate_operation == True and
validate_amount == True:
overall_valid = True
我將其重寫為:
overall_valid = True
if not any((validate_atm_id, validate_account, validate_operation, validate_amount )):
overall_valid = False
這看起來像一個錯字:
for elem in log_records:
if overall_valid == False:
count + 1 # this line shouldn't work and should be "count += 1"
log_records.remove(elem)
我將把一些部分留給讀者作為練習題
首先了解索引的工作原理
a = [11,12,13]
a[0] # gets the first element (11)
接下來了解您要索引的內容
organized_by_rows = [
["r1c1","r1c2","r1c3","r1c4"],
["r2c1","r2c2","r2c3","r2c4"]
]
organized_by_rows[0] # gets first element (["r1c1","r1c2","r1c3","r1c4"])
現在你需要做的基本上是把你的行變成列,這就是所謂的transposing
organized_by_cols = [
["r1c1","r2c1"],
["r1c2","r2c2"],
["r1c3","r2c3"],
["r1c4","r2c4"],
]
organized_by_cols[0] # gets first element (["r1c1","r2c1"])
# ie gets the first column
有很多方法可以做到這一點,但 python 提供了一種非常簡單的內置方法
organized_by_cols = zip(*organized_by_rows)
使用此信息,我相信您可以找到您的解決方案
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.