列表中具有相同字符串的多个元素之间的差异Python 2.7

时间:2013-10-08 21:18:05

标签: python list dictionary compare sublist

这有点令人困惑所以我会尽力解释我的目标。 简而言之,我正在尝试查看列表中的子列表。在这些子列表中,有些具有相同的起始元素(子列表[0]),我想记录该子列表与以相同元素开头的其他子列表之间的差异

data = [['o1415', '1', '0', '1'], ['o1415', '0', '0', '0'], ['o1414', '0', '0', '0'], ['o1414', '1', '0', '0'], ['o1414', '0', '0', '0'], ['o1408', '0', '0', '1'], ['o1406', '0', '0', '0']]
D_changes = {}

这是一个包含4个元素的列表。 。第一个有名字,第二/第三/第四个元素有数字。

我正在尝试生成一个字典,其中包含{name:[then,the,differences])}

例如data [0]和data [1]都有'o1415'作为它们的第一个元素。因为它们对于第一个元素具有相同的字符串,所以我希望将其余列表相互比较。因此数据[0]与数据[1]的数据[0] [1]和数据[0] [2]不同。 。 。所以我想在空字典D_changes中添加'o1415':['first','third']。

另一个例子是'o1414',它位于数据[2],数据[3],数据[4]中,对于这些列表,一个元素在[1]位置不同,所以我想添加' o1414':['first']到上面的空字典

最后我想获得一个包含此类内容的词典

desired_changes = {'o1415':['first','third'],'o1414':['first'],'o1408':[],'o1406':[]}

2 个答案:

答案 0 :(得分:1)

我会给你一个方向而不是一个完整的答案。

首先,将dict加载到类似项目的组中以便进一步处理;我将使用defaultdict

d = defaultdict(list)

data = [['o1415', '1', '0', '1'], ['o1415', '0', '0', '0'], ['o1414', '0', '0', '0'], ['o1414', '1', '0', '0'], ['o1414', '0', '0', '0'], ['o1408', '0', '0', '1'], ['o1406', '0', '0', '0']]

for sub in data:
    d[sub[0]].append([int(x) for x in sub[1:]])

然后,对于给定的密钥,只需查看其值的zip即可。即'o1414':

d['o1414']
Out[58]: [[0, 0, 0], [1, 0, 0], [0, 0, 0]]

list(zip(*d['o1414']))
Out[59]: [(0, 1, 0), (0, 0, 0), (0, 0, 0)]

如果全部为1或全部为0,我们知道它们是否全部相等;否则它会有所不同。所以就这样做:

[any(x) and not all(x) for x in zip(*d['o1414'])]
Out[60]: [True, False, False]

我特别喜欢那种美学 - any(x) and not all(x)。 Python有时会很漂亮。

无论如何,True表示您在该广告位中拥有不同的值。我会把它留给你为你所有的钥匙做这件事,并把它变成你想要的格式。

答案 1 :(得分:0)

我明白了。不确定应该得到-1票。这可能不是最有效的方式,但它有效

data = [['o1415', '1', '0', '1'], ['o1415', '0', '0', '0'], ['o1414', '0', '0', '0'], ['o1414', '1', '0', '0'], ['o1414', '0', '0', '0'], ['o1408', '0', '0', '1'], ['o1406', '0', '0', '0']]

D = {}   
for name in data:    
    while name:
        for k in data:
            temp = []
            if name[0] == k[0]:
                if name[1] != k[1]:
                    temp.append('first')
                if name[2] != k[2]:
                    temp.append('second')
                if name[3] != k[3]:
                    temp.append('third')
            for k in temp:
                if len(k) != 0:
                    D[name[0]] = temp
                    break
                else:
                    pass

        break