【问题标题】:Deleting elements in a list based on a spectific tuple value根据特定元组值删除列表中的元素
【发布时间】:2019-12-13 05:08:13
【问题描述】:

所以我想要一个列表,其中的元素在遍历时根据特定的元组值添加和替换。

我尝试了一些基本逻辑来删除前一个元素,以便用新元素“替换”它,但是旧元素似乎没有被删除。

 a = [['a','1','f'],['a','2','f'],['a','3','t'],['b','4','f'],['b','5','t'],['c','6','f']]


 z = []
 z.append(a[0])

 for i in range(1, len(a)):
     if str(a[i]).split(',')[2] == 't' and str(a[i]).split(',')[0] == str(a[i-1]).split(',')[0]:
         del z[i]
         z.append(a[i])
     elif a[i] not in z:
             z.append(a[i])

所以这里我有一个列表“a”,列表中有一些元组值。一些值 (a,b,c) 可能重复,并具有相应的值(f 或 t)。我想要的是将这些元组添加到'z'中,如果不存在的话,然后如果我找到一个存在并且具有相应值't'的元组,我会摆脱旧的并用它替换它。

所以z的最终输出应该是:

 ['a','3','t'], ['b','5','t'],['c','6','f']

我们遍历'a',看到['a','1','f']最初不在'z'中。我们添加它并继续遍历。然后我们看到第3个元素有['a','3','t'],所以我们用'f'删除原来的元素并用't'替换。我们也对“b”这样做,而对于“c”,没有与之对应的“t”值,所以我们保留它。

感谢您的帮助。

【问题讨论】:

    标签: python list replace tuples


    【解决方案1】:

    根据来自问题和@wim 答案的更新输入列表,我添加了一些 cmets:

    a = [['a','1','f'],['a','2','f'],['a','3','t'],['b','4','f'],['b','5','t'],['c','6','f']]
    
    # assume that a is *NOT* sorted:
    l = sorted(a, key=lambda k: (k[0], k[2]=='t'))
    # now list `l` contains sorted elements from `a` and elements containing `t` are in the "back"
    
    # we will feed this sorted list do `dict()` as [key, value] pairs where key is first element in array
    # and value is whole item
    print([*dict([i[0], i] for i in l).values()])
    

    打印:

    [['a', '3', 't'], ['b', '5', 't'], ['c', '6', 'f']]
    

    【讨论】:

      【解决方案2】:

      你可以用 dict 相当简单地做到这一点:

      >>> a = [['a','f'],['a','f'],['a','t'],['b','f'],['b','t'],['c','f']]
      >>> [*dict(a).items()]
      [('a', 't'), ('b', 't'), ('c', 'f')]
      

      在旧版本的 Python (collections.OrderedDict 执行相同操作。

      从 cmets 添加:dict() constructor 采用(以及其他选项)元组的迭代器作为参数,并按照呈现到字典项中的顺序解析它们。字典键必须都是唯一的,因此这会将您的前三个元素全部解析为键 my_dict['a'],使值等于读取的最后一个键 'a'my_dict['a'] = 't'。与'b''c' 相同。然后将字典中保留的值解压缩到一个列表中。如果它是您想要保留的输入列表中每个键的最后一项,这应该可以工作。

      【讨论】:

      • 你能解释一下这是做什么的吗? [*dict(a).items()]
      • 是的,这只是写list(dict(a).items())的简写方式。
      • 如何创建字典项目列表来摆脱我不想要的其他元组?就像你在哪里比较'f'和't'值
      • @Jbox 当您的字典列表正确排序时,它将起作用
      • dict() constructor 采用(以及其他选项)元组的迭代器作为参数,并按照呈现到字典项中的顺序解析它们。字典每个键只能有一个唯一值,因此这会将您的前三个元素全部解析为键 my_dict['a'],使值等于读取的最后一个键 'a'my_dict['a'] = 't'。与'b''c' 相同。然后将字典中保留的值解压缩到一个列表中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 2020-12-13
      • 1970-01-01
      相关资源
      最近更新 更多