用Python替换列表中的项目

时间:2014-08-18 16:27:41

标签: python list python-3.x dictionary nested-loops

我是python和编程的新手,需要一些帮助来替换列表字典中的项目。我想在下面的字典中将None替换为'None'

dict = {'Chester100': ['Caesar, Augustus', '05/10/2012', '09/09/2012', None],
        'Rochester102': ['Henrich, Norton', '08/18/2014', '12/17/2014', None],
        'Rochester100': ['Caeser, Julius', '08/18/2014', '12/17/2014', None],
        'Rochester101': [None, None, None, '08/18/2012']}

我的代码如下:

new_dict = {}

for i in dict: #This accesses each dictionary key.
    temp = []
    for j in dict[i]: #This iterates through the inner lists
        if j is None:
            temp.append('None')
        else:
            temp.append(j)
        temp2 = {str(i):temp}
        new_dict.update(temp2)

    print(new_dict)

产量

{'Chester100': ['Caesar, Augustus', '05/10/2012', '09/09/2012', 'None'], 
'Rochester102': ['Henrich, Norton', '08/18/2014', '12/17/2014', 'None'], 
'Rochester100': ['Caeser, Julius', '08/18/2014', '12/17/2014', 'None'], 
'Rochester101': ['None', 'None', 'None', '08/18/2012']}

有没有办法在更少的代码行中使用列表理解或其他方法更有效地执行此操作?应该避免嵌套for循环(因为我在我的代码中有它)?感谢。

使用Python 3.4.1

3 个答案:

答案 0 :(得分:5)

使用词典理解:

>>> {k:[e if e is not None else 'None' for e in v] for k,v in di.items()}
{'Rochester102': ['Henrich, Norton', '08/18/2014', '12/17/2014', 'None'], 'Rochester100': ['Caeser, Julius', '08/18/2014', '12/17/2014', 'None'], 'Rochester101': ['None', 'None', 'None', '08/18/2012'], 'Chester100': ['Caesar, Augustus', '05/10/2012', '09/09/2012', 'None']}

并且不要命名dict dict,因为它会用该名称掩盖内置函数。


如果您有巨大的字母或列表,则可能需要修改数据。如果是这样,这可能是最有效的:

for key, value in di.items():
    for i, e in enumerate(value):
        if e is None: di[key][i]='None'    

答案 1 :(得分:2)

  

有没有办法在更少的代码行中或更有效地执行此操作   使用列表理解还是其他方法?

是的,前提是您知道如何实现字典理解和列表理解。 注意,类似的问题已被多次询问,用户知道通过循环进行编码的方法,但无法理解如何以全面的方式实现这一点。

考虑到这一点,我将把您的示例代码转换为dict + list comprehension fashion

您的代码

new_dict = {}

for i in dict: #This accesses each dictionary key.
    temp = []
    for j in dict[i]: #This iterates through the inner lists
        if j is None:
            temp.append('None')
        else:
            temp.append(j)
        temp2 = {str(i):temp}
        new_dict.update(temp2)

    print(new_dict)

我们将从内部导航到外部

  1. 将您的显式if语句转换为三元格式

    new_dict = {}
    for i in ur_dict: #This accesses each dictionary key.
        temp = []
        for j in ur_dict[i]: #This iterates through the inner lists
            temp.append('None' if j is None else j)
            temp2 = {str(i):temp}
        new_dict.update(temp2)
    
  2. 将内循环转换为列表理解

    new_dict = {}
    for i in ur_dict: #This accesses each dictionary key.
        temp = ['None' if elem is None else elem 
                for elem in ur_dict[i]]
        temp2 = {str(i): temp}
        new_dict.update(temp2)
    
  3. 将外环转换为字典理解

    {key : ['None' if elem is None else elem 
            for elem in value] 
     for key, value in ur_dict.items()}
    
  4. 注意,如果您使用python 2.X,而不是ur_dict.items()使用ur_dict.iteritems()

答案 2 :(得分:0)

如果您可以修改原始字典,也可以

for lst in my_dict.values():
    lst[:] = map(str, lst)

这将简单地对所有列表项进行字符串化,无论它们是否为None