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



这有点令人困惑,所以我会尽力解释我的目标。 简而言之,我正在尝试查看列表中的子列表。 在这些子列表中,有些具有相同的起始元素(子列表[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 个元素的列表。 第一个元素有名称,第 2/3rd/4th 元素有数字。

我正在尝试生成一个具有 {name:[then,the,differences](} 的字典

例如,data[0] 和数据 [1] 都将 'O1415' 作为其第一个元素。 由于它们的第一个元素具有相同的字符串,因此我想将列表的其余部分相互比较。 所以数据[0]在数据[0][1]和数据[0][2]上与数据[1]不同。所以我想将"O1415":["第一","第三"]添加到空字典D_changes。

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

最后我想获得包含此类内容的字典

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

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

首先,加载一个字典以对类似的项目进行分组以进行进一步处理;我将使用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). 蟒蛇有时可能很漂亮。

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

我想

通了。 不确定是否值得-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

相关内容

  • 没有找到相关文章

最新更新