首先,这是我到目前为止的代码,稍后我将给出解释:
ll1 = [
'A',
'B',
'C',
'D'
]
l2 = [
['A', 10],
['B', 20],
['D', 5],
['A', 15],
['B', 30],
['C', 10],
['D', 15]
]
dc = dict(l2)
l3 = [[k, dc.get(k, 0)] for k in l1]
结果是这样的:
['A', 15]
['B', 30]
['C', 10]
['D', 15]
第一个列表 l1 由固定数量的键组成,第二个列表 l2 具有第一个列表中给定的每个键的值。 l2 只是一个示例,因为我稍后会获取这些值(这些值将作为列表给出),但它们将具有与 l1。每个键都需要显示,一个键可以重复,但有些键可能有空值(例如项目 C)。
但是当列表变成字典时,每个键的第一个值被丢弃,返回字典的唯一键。
如何才能使结果类似于下面的结果?
['A', 10]
['B', 20]
['C', 0]
['D', 5]
['A', 15]
['B', 30]
['C', 10]
['D', 15]
另一个例子是:
database_keys = [
'First Name',
'Last Name',
'Email',
'City'
]
database_input = [
['First Name', 'John'],
['Last Name', 'Doe'],
['Email', 'johndoe@test.com'],
['First Name', 'Jane'],
['Email', 'jane@test.com']
]
Output:
['First Name', 'John']
['Last Name', 'Doe']
['Email', 'johndoe@test.com']
['City', None]
['First Name', 'Jane']
['Last Name', None]
['Email', 'jane@test.com']
['City', None]
请您参考如下方法:
我会使用生成器来填充缺失值,只保留 cycle的键,当下一个需要的键不是数据中的键时,只产生空值:
import itertools
def fill_the_blanks(data, keys):
keys = itertools.cycle(keys)
for name, value in data:
k = next(keys)
while name!=k:
yield [k,None]
k = next(keys)
yield [name,value]
>>> from pprint import pprint
>>> pprint( list(fill_the_blanks(l2, ll1)) )
[['A', 10],
['B', 20],
['C', None],
['D', 5],
['A', 15],
['B', 30],
['C', 10],
['D', 15]]
>>> pprint( list(fill_the_blanks(database_input,database_keys)) )
[['First Name', 'John'],
['Last Name', 'Doe'],
['Email', 'johndoe@test.com'],
['City', None],
['First Name', 'Jane'],
['Last Name', None],
['Email', 'jane@test.com']]
作为替代方案,如果您知道第一个键 'First Name' 将始终标记条目的开头为什么不直接使用 dict.fromkeys然后填写直到达到下一个“第一个值”:
def gen_dicts(data, keys):
first_key = keys[0]
entry = None #placeholder for first time
for name, value in data:
if name == first_key:
if entry is not None: #skip first time
yield entry
entry = dict.fromkeys(keys)
entry[name] = value
yield entry #last one
>>> from pprint import pprint
>>> pprint( list(gen_dicts(l2, ll1)) )
[{'A': 10, 'B': 20, 'C': None, 'D': 5}, {'A': 15, 'B': 30, 'C': 10, 'D': 15}]
>>> pprint( list(gen_dicts(database_input, database_keys)) )
[{'City': None,
'Email': 'johndoe@test.com',
'First Name': 'John',
'Last Name': 'Doe'},
{'City': None,
'Email': 'jane@test.com',
'First Name': 'Jane',
'Last Name': None}]
