簡體   English   中英

如何將列表列表更改為鍵值?

[英]How do I change a list of lists to key, value?

我想這樣轉換數據:csv中的第一行是鍵,以下行是值。 我怎樣才能做到這一點?

所以我希望鍵是'SkuPartNumber','ActiveUnits','ConsumedUnits',值是它下面的行。

目標是我可以按照下面的方式查詢記錄並將值存儲在其他位置。

for i in records:
 ...
 results.append((i['SkuPartNumber'],i['ActiveUnits'],i['ConsumedUnits'])

碼:

>>>cmd = ['C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\powershell.exe', 'script.ps1']
>>>subprocess.call(cmd)
>>> with open ('sku.csv', 'r') as sku:
...     reader = csv.reader(sku)
...     records = list(reader)
...
>>> type(records)
<class 'list'>
>>> pprint(records)
[['SkuPartNumber', 'ActiveUnits', 'ConsumedUnits'],
 ['EXCHANGESTANDARD', '1', '1'],
 ['O365_BUSINESS_PREMIUM', '4', '4']]
>>>

感謝一些幫助。

預期結果:

[{
    "SkuPartNumber": "EXCHANGESTANDARD",
    "ActiveUnits": 1,
    "ConsumedUnits": 1
}, {
    "SkuPartNumber": "O365_Business_Premium",
    "ActiveUnits": 4,
    "ConsumedUnits": 4
}]

我不知道為什么你把subprocesses,powershell和其他主題帶到這里,但你需要的是來自csv模塊的DictReader

>>> from csv import DictReader
>>> filedata = '''SkuPartNumber,ActiveUnits,ConsumedUnits
... EXCHANGESTANDARD,1,1
... O365_BUSINESS_PREMIUM,4,4
... '''
>>> list(DictReader(filedata.splitlines()))
[{'ActiveUnits': '1', 'ConsumedUnits': '1', 'SkuPartNumber': 'EXCHANGESTANDARD'}, {'ActiveUnits': '4', 'ConsumedUnits': '4', 'SkuPartNumber': 'O365_BUSINESS_PREMIUM'}]

在您的實際代碼中,只需使用list(DictReader(f)) ,其中f是打開文件的名稱。

records = [['SkuPartNumber', 'ActiveUnits', 'ConsumedUnits'],
           ['EXCHANGESTANDARD', '1', '1'],
           ['O365_BUSINESS_PREMIUM', '4', '4']]


recorddictlist = [dict(SkuPartNumber=r[0],
                       ActiveUnits=r[1],
                       ConsumedUnits=r[2]) for r in records[1:]]

print(recorddictlist)

這不是最靈活的,但假設您的子進程的輸出是穩定的,我發現它最容易閱讀。

否則,您可以在注釋中使用csv.DictReader

# new empty list of records in new format
transformed_records = []

# iterate over records, skipping the first list which is key names
for values in records[1:]:

    # fresh dict to hold this row
    newdict = {}

    # iterate over each value
    for position,value in enumerate(values):

        # fetch key name from first list in records
        key = records[0][position]
        newdict[key] = value

    # add dict to the list
    transformed_records.append(newdict)

我能想到的最簡單的方法:

from pprint import pprint

records = [['SkuPartNumber', 'ActiveUnits', 'ConsumedUnits'],
           ['EXCHANGESTANDARD', '1', '1'],
           ['O365_BUSINESS_PREMIUM', '4', '4']]

fields = records[0]
result = [dict(zip(fields, record)) for record in records[1:]]
pprint(result)

輸出:

[{'ActiveUnits': '1',
  'ConsumedUnits': '1',
  'SkuPartNumber': 'EXCHANGESTANDARD'},
 {'ActiveUnits': '4',
  'ConsumedUnits': '4',
  'SkuPartNumber': 'O365_BUSINESS_PREMIUM'}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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