【问题标题】:sorting a list of tuples对元组列表进行排序
【发布时间】:2010-07-16 04:59:55
【问题描述】:

我有一个 (a,b,c,d) 形式的元组列表,我只想将那些具有唯一值 'a' 的元组复制到一个新列表中。我对 python 很陌生。

当前行不通的想法:

for (x) in list:
   a,b,c,d=(x)
   if list.count(a)==1:
      newlist.append(x)

【问题讨论】:

  • 只是作为一个建议:如果您提供一些输入和预期输出示例,您将帮助那些想要验证他们的解决方案是否像您想要的那样工作的人。
  • 你应该使用L而不是list,这样你就不会隐藏内置的list类型。

标签: python sorting list tuples


【解决方案1】:

如果您不想想要添加任何具有重复 a 值的元组(而不是添加给定 a 的第一次出现,但后面的都没有):

seen = {}
for x in your_list:
    a,b,c,d = x
    seen.setdefault(a, []).append(x)

newlist = []
for a,x_vals in seen.iteritems():
    if len(x_vals) == 1:
        newlist.append(x_vals[0])

【讨论】:

    【解决方案2】:

    您可以使用集合来跟踪重复项:

    seen_a = set()
    for x in list:
        a, b, c, d = x
        if a not in seen_a:
            newlist.append(x)
            seen_a.add(x)
    

    【讨论】:

    • 这与 Jesses 的建议一样,将采用“a”的每个值的第一个条目,而不仅仅是“a”唯一的值。
    【解决方案3】:
    values = {}
    
    for t in tups:
      a,b,c,d = t
      if a not in values:
        values[a] = (1, t)
      else:
        count, tup = values[a]
        values[a] = (count+1, t)
    
    unique_tups = map(lambda v: v[1],
                      filter(lambda k: k[0] == 1, values.values()))
    

    我正在使用字典来存储 a 值和具有该 a 值的元组。该键的值是(count, tuple) 的元组,其中counta 被看到的次数。

    最后,我过滤values 字典那些acount 为1,它们是唯一的。然后我映射该列表以仅返回那些元组,因为 count 的值将是 1。

    现在,unique_tups 是所有具有唯一 a 的元组的列表。

    收到评论后更新,谢谢!

    【讨论】:

    • 这并没有真正列出 OP 要求的列表。它也将失去对订单的跟踪(OP没有说这是否是问题)并且它不仅将条目放在“a”唯一的位置,而且只会为“a”的每个值选择第一个条目
    • 感谢您的反馈,我已对其进行了更新以使其正确。
    【解决方案4】:

    您确实可以对列表进行排序,然后对其进行迭代:

    xs = [(1,2,3,4), (5, 2, 3, 4), (2, 3, 3, 3), (1, 5, 2, 3)]
    newList = []
    xs.sort()
    lastX = None
    for x in xs:
      if lastX:
        if lastX[0] == x[0]:
          lastX = None
        else:
          newList.append(lastX)
          lastX = x
    if lastX:
      newList.append(lastX)
    

    【讨论】:

    • 等一下,这不会保留第一个具有给定值的 'a' 的元组并忽略其余部分吗?例如,如果前几个元组是 [(125, b, c, d) (125, b, c, d) (127, b, c, d) (127, b, c, d) (128, b , c, d) (129, b, c, d)],那么这个迭代将附加第一个元组而不是第二个,第三个元组而不是第四个,当这四个元组都没有唯一的 'a' 值时.
    • 好吧,我误解了你的目的。更新后的代码将查看最后一个元素,并且仅当它与 [0] 上的当前元素不同(并且没有其他元素具有该 [0])时,才会将其添加到输出列表中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 2017-03-23
    • 2015-01-28
    • 2015-11-28
    • 2010-10-29
    相关资源
    最近更新 更多