【问题标题】:Difference between multiple elements in list with same string . Python 2.7 [closed]列表中具有相同字符串的多个元素之间的差异。 Python 2.7 [关闭]
【发布时间】:2013-10-16 00:28:13
【问题描述】:

这有点令人困惑,所以我会尽力解释我的目标。 简而言之,我正在尝试查看列表中的子列表。在这些子列表中,有些具有相同的起始元素(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' 作为它们的第一个元素。因为它们对于第一个元素具有相同的字符串,所以我想将其余列表相互比较。因此 data[0] 与 data[0][1] 和 data[0][2] 与 data[1] 不同。 . .所以我想将 'o1415':['first','third'] 添加到空字典 D_changes 中。

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

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

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

【问题讨论】:

  • 您尝试的解决方案有什么问题?
  • 要求代码的问题必须表明对所解决问题的最低理解。包括尝试的解决方案、它们为什么不起作用以及预期的结果。另请参阅:堆栈溢出问题清单

标签: python list dictionary compare sublist


【解决方案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, 5, 0], [1, 6, 0]] [(1, 1), (5, 6), (0, 0)] [假,假,假] 同时使用相同的行?
  • @draconisthe0ry anyall 检查集合的真实性 - 即布尔上下文中元素的值。您最初的问题是关于位图 - 元素只能是 1 或 0。这就是我的回答。
  • 哦,好吧,我看到了区别。你说的对 。谢谢 。我应该研究什么来检查元组中是否包含所有相同的元素?
  • @draconisthe0ry 我在你的另一个帖子中回答了这个问题。你有什么理由不接受这个答案?
  • 抱歉!我只是注意到我没有接受它
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2013-06-05
    • 1970-01-01
    • 2011-01-24
    • 2020-02-09
    • 2014-03-06
    • 2023-03-07
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    相关资源
    最近更新 更多