对于列表中的元组,如果元组的第3个元素在dicionary中,则用值替换元素

时间:2015-08-24 15:28:34

标签: python

我有一个元组列表:

my_list = [(a1, b1, c1), ... , (an, bn, cn)]

我也有一本字典:

my_dict = {x1: y1, ... , xm: ym}

我想创建一个函数来搜索my_list中my_dict中每个元组的第3个元素。如果元组的第3个元素在my_dict中,则将该元素替换为字典中的值,并将此更新的元组追加到新列表new_list。如果元组的第3个元素不在my_dict中,则将原始元组保持不变为new_list。

因此,例如,如果c在字典中具有值q,那么我想用q替换c:

(a,b,c)---> (a,b,q)

如果c不在dictonary中,我希望元组保持不变:

(a,b,c)---> (a,b,c)

我写了一个for循环,但不明白它为什么不工作:

def my_func(a,b):
    y = []
    for x in a:
        if b.get(x[2]) == None:
            y.append(x)
        else:
            y.append((x[0], x[1], b.get(x[2])))
    return y

那么我的目标是评估my_func(my_list,my_dict)。但是,它只返回原始列表my_list而没有任何更改。我已尝试过其他几种形式,如"如果x [2]在my_dict"没有运气。

我非常感谢任何建议!

编辑:

列表和字典的一个例子是:

my_list = [ (‘string1_1’, 0.3, ‘string2_1’), (‘string1_2’, 0.5, ‘string2_2’), (‘string1_3’, 0.4, ‘string2_3’), (‘string1_4’, 0.65, ‘string2_4’)]

my_dict = {‘string2_1’:  ‘string2_1_EDIT’,  ‘string2_4’ : ‘string2_4_EDIT’}

2 个答案:

答案 0 :(得分:3)

您可以将其简化为列表表达式:

[(x[0], x[1], b.get(x[2], x[2])) for x in a]

哪个应该有用 - 你能提供一些样本输入吗?

答案 1 :(得分:1)

为变量使用更有意义的名称确实很有用。

dicts的.get()方法可以采用第二个参数,当找不到密钥时会返回该参数。

my_list = [("a1", "b1", "c1"),  ("an", "bn", "cn")]
my_dict = {"c1": "present"}

def myfunc(lst, dct):
    result = []
    for a, b, c in lst:
        el3 = dct.get(c, c)
        result.append((a, b, el3))
    return result

print myfunc(my_list, my_dict)

打印

[('a1', 'b1', 'present'), ('an', 'bn', 'cn')]

更紧凑的版本会读取

def myfunc(lst, dct):
    return [(a, b, dct.get(c, c)) for (a, b, c) in lst]