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

列表中具有相同字符串的多个元素之间的差异。Python 2.7,python,list,dictionary,compare,sublist,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]),我想记录该子列表与以相同元素开头的其他子列表之间的差异

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])的字典

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

另一个例子是数据[2]、数据[3]、数据[4]中的“o1414”,对于这些列表,[1]位置的一个元素不同,因此我想将“o1414”:[“first]”添加到上面的空字典中

最后我想得到一本有这种内容的词典

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

我想出来了。我不确定这是否值得投1-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

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

首先,加载一个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
。i、 e.对于“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]
我特别喜欢它的美学-
任何(x)而不是所有(x)
。巨蟒有时是美丽的


无论如何,
True
意味着您在该插槽中有不同的值。我将让您自行决定对所有密钥执行此操作,并将其转换为您想要的格式。

您尝试的解决方案有什么问题吗?询问代码的问题必须表明您对正在解决的问题的最低理解。包括尝试过的解决方案、它们不起作用的原因以及预期结果。另请参见:堆栈溢出问题检查表[[1,5,0],[1,6,0]][(1,1)、(5,6)、(0,0)][False,False,False],同时使用相同的行?@DracionsThy
any
all
检查集合的真实性-即布尔上下文中元素的值。您最初的问题是关于位图的-其中元素只能是1或0。我就是这么回答的。哦,好吧,我明白了区别。你是对的。非常感谢。我应该研究什么来检查元组中是否有所有相同的元素?@draconistheory我在你的另一个线程中回答了这个问题。你为什么不接受这个答案?很抱歉!我只是注意到我没有接受