如何更改字典中的元组值?

时间:2019-01-11 05:54:28

标签: python

我有这本字典:

d = {'a': (1, 2, 'a'), 'b': (1, 2, 'b'), 'c': (2, 4, 'c'), 'd': (1, 3, 'd'), 'e': (0, 1, 'e'), 'f': (0, 1, 'f'), 'g': (1, 3, 'g'), 'h': (0, 1, 'h'), 'j': (1, 2, 'j'), 'i': (0, 1, 'i'), 'k': (-1, 0, 'k')}

如果键与参数匹配,如何为该字典中的特定键/值对减去1的值?

例如,我想将键 a 的值减去1,以便现在显示:

{'a': (0, 1, 'a')

当再次创建相同的字典时,如何编辑该特定键的值并仅将整数减1?

到目前为止的

代码:

def matching(key_to_subtract): 
    for key, value in d.items():
        if key_to_subtract == key:


matching("a")

所需的输出:

{'a': (0, 1, 'a'), 'b': (1, 2, 'b'), 'c': (2, 4, 'c'), 'd': (1, 3, 'd'), 'e': (0, 1, 'e'), 'f': (0, 1, 'f'), 'g': (1, 3, 'g'), 'h': (0, 1, 'h'), 'j': (1, 2, 'j'), 'i': (0, 1, 'i'), 'k': (-1, 0, 'k')}

5 个答案:

答案 0 :(得分:1)

由于tuple是不可变的,因此您必须构建一个新的并将其绑定到密钥。但是,您不必迭代dict来搜索给定的密钥。这就是dict的重点:

def decrement(d, k): 
    # if k in d:  # if you are not certain the key exists
    d[k] = tuple(v-1 if isinstance(v, int) else v for v in d[k])

答案 1 :(得分:0)

由于元组是不可变的,因此您必须再次重建元组,并将新元组重新分配给您从中获得的相同键。可以使用理解力以1-2行的形式编写,但是很难理解,希望对您有所帮助!

使用生成器表达式

def matching(key_to_subtract):
    # generator expression force evaluated as tuple
    d[key_to_subtract] = tuple(item-1 if isinstance(item, int) else item for item in d.get(key_to_subtract)) 

展开表格

d = {'a': (1, 2, 'a'), 'b': (1, 2, 'b'), 'c': (2, 4, 'c'), 'd': (1, 3, 'd'), 'e': (0, 1, 'e'), 'f': (0, 1, 'f'), 'g': (1, 3, 'g'), 'h': (0, 1, 'h'), 'j': (1, 2, 'j'), 'i': (0, 1, 'i'), 'k': (-1, 0, 'k')}

def matching(key_to_subtract): 

    buffer = [] # to build new tuple later from this list
    for item in d.get(key_to_subtract): # get the tuple and iterate over
        try:
            buffer.append(item - 1) # subtract 1
        except TypeError:
            buffer.append(item) # append directly if its not integer

    d[key_to_subtract] = tuple(buffer) # reassign the list as tuple

matching("a")

答案 2 :(得分:0)

您不能更改元组的内容。因此,您需要构造一个新的元组并将其分配给dict:

d = {'a': (1, 2, 'a'), 'b': (1, 2, 'b'), 'c': (2, 4, 'c')}
d['a'] = tuple( i - 1 if isinstance(i, int) else i for i in d['a'] )

# d become {'a': (0, 1, 'a'), 'b': (1, 2, 'b'), 'c': (2, 4, 'c')}

答案 3 :(得分:0)

根据您的问题,我提出了与您的代码不同的另一种方法。原因是因为d.items()创建了一个视图,该视图可用于检查,但不适用于更新代码。

因此,我建议使用d.keys()搜索key_to_subtract的实例。然后将元组更改为list(或者,您也可以使用另一种方法在所需的位置上切片元组,然后添加新值(如果是大元组,则可以更快)),然后用新值替换键将其从列表更改为元组):

 constructor(props) {
  super(props);
  this.myRef = React.createRef();
}

handleScrollToElement(event) {
  if (<some_logic>){
    window.scrollTo(0, this.myRef.current.offsetTop);
  }
}

render() {

  return (
    <div>
      <div ref={this.myRef}></div>
    </div>)
}

基于https://docs.python.org/3.7/library/stdtypes.html#dict-views

中的功能

答案 4 :(得分:-1)

由于元组是不可变的对象,因此可以这样做。

d = {'a': (1, 2, 'a'), 'b': (1, 2, 'b'), 'c': (2, 4, 'c'), 'd': (1, 3, 'd'), 'e': (0, 1, 'e'), 'f': (0, 1, 'f'), 'g': (1, 3, 'g'), 'h': (0, 1, 'h'), 'j': (1, 2, 'j'), 'i': (0, 1, 'i'), 'k': (-1, 0, 'k')}

def change_value_by_key_pos(data, key, pos, step):
    for k,v in data.items():
        if k == key:
            list_items = list(data[key])
            list_items[pos] = list_items[pos]+step
            data[key] = tuple(list_items)
    return data
data = change_value_by_key_pos(d,'a',1,1)
print(data)