Python 使用两个键创建字典,其中两个键引用一个值

Python 使用两个键创建字典,其中两个键引用一个值,python,dictionary,key,Python,Dictionary,Key,我希望有一个字典(或支持此功能的数据结构),可以访问两个键下的值,但是当您使用一个键来访问.pop()值时,它也会弹出另一个项 整个词典中只能出现两个相同的条目 这些项目在不同的列表中。列表通过一个键访问 两项的删除都必须是O(1)(就像简单地使用.pop()) 我的尝试: from collections import defaultdict class Value: def __init__(self, v=None): self.v = v def

我希望有一个字典(或支持此功能的数据结构),可以访问两个键下的值,但是当您使用一个键来访问.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]})

像这样的怎么样

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]})
defaultdict(,{'aP':[barrd,laary],'rS':[barrd,laary],'rP':[grrup],'uS':[grrup]})
defaultdict(,{'aP':[laary],'rS':[laary],'rP':[grrup],'uS':[grrup]})

该数据结构是否应具有类似于
dict
的接口?然后是简化示例
{'a':[1,2,3],'b':[2,3]}
2
的值进行压缩是否会导致
{'a':[1,3],'b':[3]}
或其他情况?对于同一个键的重复值,弹出它们只是删除一个实例还是所有实例?如果你能在文章中提供一些简单的输入/输出示例,那会有所帮助。@JonClements你提供的结果将是正确的。好的,我现在就更新。还有。。。比如:
data=[1,2];d={'a':数据,'b':数据}
?是否保证或应该保证您的值总是列表?您的简化示例与您的约束不一致:您如何从
d[a]
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]})