我有这本字典:
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')}
答案 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)