繁体   English   中英

基于spectific元组值删除列表中的元素

[英]Deleting elements in a list based on a spectific tuple value

所以我希望有一个列表,其中包含的元素在遍历时基于特定的元组值进行添加和替换。

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

 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”值,因此我们将其保留。

谢谢您的帮助。

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

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

在旧版本的Python(<= 3.6)中,使用collections.OrderedDict执行相同的操作。

从注释中添加: dict()构造函数将(作为其他选项)元组的迭代器作为参数,并按照呈现在字典项中的顺序对它们进行解析。 字典键必须都是唯一的,因此这会将前三个元素全部解析为关键字my_dict['a'] ,使值等于读取的最后一个键'a' ,或my_dict['a'] = 't' 'b''c' 然后将字典中保留的值解压缩到列表中。 这应该有效,前提是它是输入列表中要保留的每个键的最后一项。

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

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']]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM