Skip to main content
 首页 » 编程设计

python之加入具有重复值的列表

2025年05月04日26cyq1162

首先,这是我到目前为止的代码,稍后我将给出解释:

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}]