如何将字典中的键更改为大写并在结果字典中添加相同键的值?

问题描述 投票:0回答:7

我有一本看起来像这样的字典:

d = {'A':110, 'a':100, 'T':50, 't':5}

我想将键更改为大写并组合

A+a
T+t
并添加它们的值,以便生成的字典如下所示:

d = {'A': 210, T: 55}

这是我尝试过的:

for k, v in d.items():
    k.upper(), v

结果是:

('A', 110)
('A', 100)
('T', 50)
('t', 5)

我看起来像元组,但我想在字典中更改它,所以我尝试编写一个函数:

def Upper(d):
    for k, v in d.items:
        k.upper(), v
    return d

但它返回的字典没有变化。

将键更改为大写后,我找到了如何在字典中添加键值的解决方案:

dict([(x, a[x] + b[x]) if (x in a and x in b) else (x, a[x]) if (x in a) else (x, b[x])

但首先我需要获得大写字母的键!

python
7个回答
14
投票

Counter
做得很好

>>> d = {'A':110, 'a':100, 'T':50, 't':5}
>>> from collections import Counter
>>> c = Counter()
>>> for k,v in d.items():
...     c.update({k.upper(): v})
... 
>>> c
Counter({'A': 210, 'T': 55})

以下是 Counter 的帮助:

>>> print(Counter.__doc__)
Dict subclass for counting hashable items.  Sometimes called a bag
    or multiset.  Elements are stored as dictionary keys and their counts
    are stored as dictionary values.

    >>> c = Counter('abcdeabcdabcaba')  # count elements from a string

    >>> c.most_common(3)                # three most common elements
    [('a', 5), ('b', 4), ('c', 3)]
    >>> sorted(c)                       # list all unique elements
    ['a', 'b', 'c', 'd', 'e']
    >>> ''.join(sorted(c.elements()))   # list elements with repetitions
    'aaaaabbbbcccdde'
    >>> sum(c.values())                 # total of all counts
    15

    >>> c['a']                          # count of letter 'a'
    5
    >>> for elem in 'shazam':           # update counts from an iterable
    ...     c[elem] += 1                # by adding 1 to each element's count
    >>> c['a']                          # now there are seven 'a'
    7
    >>> del c['b']                      # remove all 'b'
    >>> c['b']                          # now there are zero 'b'
    0

    >>> d = Counter('simsalabim')       # make another counter
    >>> c.update(d)                     # add in the second counter
    >>> c['a']                          # now there are nine 'a'
    9

    >>> c.clear()                       # empty the counter
    >>> c
    Counter()

    Note:  If a count is set to zero or reduced to zero, it will remain
    in the counter until the entry is deleted or the counter is cleared:

    >>> c = Counter('aaabbc')
    >>> c['b'] -= 2                     # reduce the count of 'b' by two
    >>> c.most_common()                 # 'b' is still in, but its count is zero
    [('a', 3), ('c', 1), ('b', 0)]

6
投票

upper()
方法不会改变任何东西。您可以使用以下代码:

def capitalize_keys(d):
    result = {}
    for key, value in d.items():
        upper_key = key.upper()
        result[upper_key] = result.get(upper_key, 0) + value
    return result

2
投票

defaultdict
有帮助:

>>> from collections import defaultdict
>>> d = {'A':110, 'a':100, 'T':50, 't':5}
>>> new_d = defaultdict(int)
>>> for key, val in d.iteritems():
...     new_d[key.upper()] += val
...
>>> dict(new_d)
{'A': 210, 'T': 55}

1
投票

我认为你必须重建你的字典。示例:

from collections import defaultdict

d={'A':110, 'a':100, 'T':50, 't':5}

def upper(d):
        nd=defaultdict(int)
        for k, v in d.iteritems():
                nd[k.upper()]+=v
        return dict(nd)

print d
print upper(d)

输出:

{'A': 110, 'a': 100, 'T': 50, 't': 5}
{'A': 210, 'T': 55}

或者使用 @citxx 的解决方案和

result.get(upper_key, 0) + value
并完全避免使用 defaultdict。


1
投票

有了这个功能(已更正):

>>> def upper_kdict(d):
...     r = {}
...     for k, v in d.items():
...             K = k.upper()
...             r[K] = v if not r.__contains__(K) else v + r[K]
...     return r
... 
>>> 
>>> d = {'a': 100, 'A': 110, 'b': 20, 'B': 1000, 'C': 150, 'c': 100, 'd': 180}
>>> upper_kdict(d)
{'A': 210, 'C': 250, 'B': 1020, 'D': 180}

1
投票
d = {'A':110, 'a':100, 'T':50, 't':5}
{i.lower(): d.get(i.lower(),0)+d.get(i.upper(),0) for i in d.keys()}
// {'a': 210, 't': 55}

如果您想要大写的按键,请使用

{i.upper(): d.get(i.lower(),0)+d.get(i.upper(),0) for i in d.keys()}
// {'A': 210, 'T': 55}

输出:


0
投票

使用很长的字典理解:

d = {'A':110, 'a':100, 'T':50, 't':5}
d = dict((k, v + d.get(k.lower(), 0)) if (k == k.upper()) 
    else (k.upper(), v) for (k, v) in d.items() 
    if ((k == k.upper()) or (k == k.lower() and not (k.upper() in d))))
print d

输出:

{'A': 210, 'T': 55}
© www.soinside.com 2019 - 2024. All rights reserved.