簡體   English   中英

如何將變量設置為二維列表中的特定列? 是否可以?

[英]How to set a variable to a specific column in a 2D list? Is it possible?

我正在嘗試創建一個“檢查記錄”function,它接受一個二維列表( IDaccountoperationamount )並返回列表中有效或無效項目的數量。 這是基於設定的標准。 每個標准也有自己的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM