使用2个键来创建字典,引用一个值

时间:2018-04-23 08:30:28

标签: python dictionary key

我希望有一个字典(或支持此功能的数据结构)可以访问两个键下的值,但是当你使用一个键.pop()值时,它也会弹出另一个项目。

  • 整个字典中只能出现两个相同的项目
  • 这些项目位于不同的列表中。列表可通过密钥
  • 访问
  • 删除这两个项目必须是O(1)(就好像只使用.pop()

我的尝试:

from collections import defaultdict

class Value:
    def __init__(self, v=None):
        self.v = v

    def __repr__(self):
        return str(self.v)

list_of_words = ['barrd', 'laary', 'grrup']
words = defaultdict(list)

for word in list_of_words:
    temp_word = Value(word)
    words[word[1:2]+'P'].append(temp_word)
    words[word[-2:-1]+'S'].append(temp_word)


print(words)
current = 'baard'
print(words[current[-2:-1]+'P'].pop())
print(words)

实际输出:

defaultdict(<class 'list'>, {'aP': [barrd, laary], 'rS': [barrd, laary], 'rP': [grrup], 'uS': [grrup]})
grrup
defaultdict(<class 'list'>, {'aP': [barrd, laary], 'rS': [barrd, laary], 'rP': [], 'uS': [grrup]})

所需输出:(从两个关键位置删除'grrup')

defaultdict(<class 'list'>, {'aP': [barrd, laary], 'rS': [barrd, laary], 'rP': [grrup], 'uS': [grrup]})
grrup
defaultdict(<class 'list'>, {'aP': [barrd, laary], 'rS': [barrd, laary], 'rP': [], 'uS': []})

简化示例:

d = {'a': [10, 2, 3], 'b': [2, 10]}
d.pop('b') # pop's 10 from key 'b', also removing it from 'a'
d = {'a': [2, 3], 'b': [2]}

1 个答案:

答案 0 :(得分:0)

这样的事情怎么样?

from collections import defaultdict

class MyDataStructure(defaultdict):
    def mypop(self, value):
        for key in self:
            self[key] = [i for i in self[key] if str(i) != str(value)]
        return self

class Value:
    def __init__(self, v=None):
        self.v = v

    def __repr__(self):
        return str(self.v)

list_of_words = ['barrd', 'laary', 'grrup']
words = MyDataStructure(list)
# pdb.set_trace()

for word in list_of_words:
    temp_word = Value(word)
    # second letter + P
    words[word[1:2] + 'P'].append(temp_word)
    # second last letter + S
    words[word[-2:-1] + 'S'].append(temp_word)

print(words)
current = 'barrd'
words.mypop(current)
print(words)

输出:

defaultdict(<class 'list'>, {'aP': [barrd, laary], 'rS': [barrd, laary], 'rP': [grrup], 'uS': [grrup]})
defaultdict(<class 'list'>, {'aP': [laary], 'rS': [laary], 'rP': [grrup], 'uS': [grrup]})