如何在python中创建双向表?

如何在python中创建双向表?,python,Python,如何在python中创建双向表?我在一个数据集中有两个分类变量,我想通过创建一个双向表来查看这两个变量之间的关系。谢谢。假设你不需要做任何插值,你可以使用字典。使用(x,y)元组作为键,使用任何值作为值。例如,一个简单的2x2表,如下所示: ___0___1___ 0 | 0 0.5 1 | 0.5 1 import collections class BDMap: def __init__(self): self.x_table = {}

如何在python中创建双向表?我在一个数据集中有两个分类变量,我想通过创建一个双向表来查看这两个变量之间的关系。谢谢。

假设你不需要做任何插值,你可以使用字典。使用
(x,y)
元组作为键,使用任何值作为值。例如,一个简单的2x2表,如下所示:

   ___0___1___
0 |   0   0.5
1 |   0.5 1
import collections

class BDMap:
    def __init__(self):
        self.x_table = {}
        self.y_table = {}

    def get(self, x = None, y = None):
        if (x != None) and (y != None):
            y_vals = self.x_table[x]
            if (y in y_vals):
                return (x, y)
        elif x != None:
            return self.x_table[x]
        elif y != None:
            return self.y_table[y]

    def set(self, x, y):
        if isinstance(x, collections.Hashable) and isinstance(y, collections.Hashable):
            self.x_table[x] = self.x_table.get(x, list()) + [y]
            self.y_table[y] = self.y_table.get(y, list()) + [x]
        else:
            raise TypeError("unhashable type")
代码如下所示:

two_way_lookup = {
                  (0, 0) : 0,
                  (0, 1) : 0.5,
                  (1, 0) : 0.5,
                  (1, 1) : 1
                 }
print(two_way_lookup.get((0, 1))) # prints 0.5

如果您的数据相当大,那么标准库中最好的解决方案可能是使用
sqlite
,内存数据库:

有一个:


您可以使用pip install bidict安装它


编辑:对于您的实际问题-如果我理解正确-我将使用:



您可以创建类似于两级dict的内容(即,包含两个以相反顺序映射相同数据的dict的dict:

>>> mappings=[(0, 6), (1, 7), (2, 8), (3, 9), (4, 10)]
>>> view = dict(view1=dict(mappings), view2=dict(reversed(k) for k in mappings))
>>> view
{'view2': {8: 2, 9: 3, 10: 4, 6: 0, 7: 1},
'view1': {0: 6, 1: 7, 2: 8, 3: 9, 4: 10}}

您可以使用
DoubleDict
,如中所示。

如果您想要一种自制的、不稳定的解决方案,您可以这样做:

   ___0___1___
0 |   0   0.5
1 |   0.5 1
import collections

class BDMap:
    def __init__(self):
        self.x_table = {}
        self.y_table = {}

    def get(self, x = None, y = None):
        if (x != None) and (y != None):
            y_vals = self.x_table[x]
            if (y in y_vals):
                return (x, y)
        elif x != None:
            return self.x_table[x]
        elif y != None:
            return self.y_table[y]

    def set(self, x, y):
        if isinstance(x, collections.Hashable) and isinstance(y, collections.Hashable):
            self.x_table[x] = self.x_table.get(x, list()) + [y]
            self.y_table[y] = self.y_table.get(y, list()) + [x]
        else:
            raise TypeError("unhashable type")

除了使用小数据集的一次性脚本之外,使用上述方法之一无疑会更好:)

可能的重复您指的是双向映射吗?您能给我们一个示例数据集吗?创建两个字典,每一个都相反,也就是说,一个问题的关键是另一个问题的价值。解决你的问题?我认为你想要的很明显,但我显然错了。你能详细说明一下“双向桌”是什么意思吗?您指的是按行和列查找值的表,还是brice建议的双向映射?这看起来并没有真正回答这个问题。Dicts只提供单向查找,OP要求提供双向表。@Marcin(&Ashwini)我理解“双向表”的意思“查找
x
y
以获得表示元素组合的值的表。至少在我看来,这与双向查找不同,在双向查找中,键/值对可以在任意方向使用。”我想通过创建双向表来查看两个变量之间的关系。“谢谢。”建议OP需要双向查找。@Marcin我认为这正是支持我解释的行。询问者可能已经有两个键,并且想要查找它们之间的关系。两列是性别(M,F)和体型(AboutRt,OverW,UnderW)。我想做的就是数一数有多少雄性大约是T、过胖和过胖,然后对雌性做同样的事情。我希望python中有一个类似于R中的gmodels库的包,您可以在其中创建一个在R中找到的交叉表。再次感谢。@TarekDeeb--请编辑您的问题,并用一个小样本数据填充它…@TarekDeeb--您可能应该看看
pandas
。添加了一个示例…data.head()性别身高GPA HS GPA座位WT0女性64 2.60 2.63米约1号男性69 2.70 3.72米约2号女性66 3.00 3.44 F约3号女性63 3.11 2.73 F约4号男性72 3.40 2.35 B超重No@TarekDeeb--请更新使用格式良好的数据编辑您的问题-不要将其粘贴到注释中。这对于回答您问题的人和可能有类似问题的其他读者来说都非常容易。这对于一对一函数很有效,但如果不假设此条件,则会有点棘手。例如:x=4,y=(-2,2)。
import collections

class BDMap:
    def __init__(self):
        self.x_table = {}
        self.y_table = {}

    def get(self, x = None, y = None):
        if (x != None) and (y != None):
            y_vals = self.x_table[x]
            if (y in y_vals):
                return (x, y)
        elif x != None:
            return self.x_table[x]
        elif y != None:
            return self.y_table[y]

    def set(self, x, y):
        if isinstance(x, collections.Hashable) and isinstance(y, collections.Hashable):
            self.x_table[x] = self.x_table.get(x, list()) + [y]
            self.y_table[y] = self.y_table.get(y, list()) + [x]
        else:
            raise TypeError("unhashable type")