Python - 通过列表中的前缀和后缀删除元组

Posted

技术标签:

【中文标题】Python - 通过列表中的前缀和后缀删除元组【英文标题】:Python - Removing tuples by prefix and suffix from list 【发布时间】:2018-08-26 08:49:42 【问题描述】:

根据元组的开头或结尾,从 python 列表中删除元组(并使用已删除的元组更新列表)的最快方法是什么。

例子:

import itertools
l1 = ["a", "b", "c"]
l2 = ["d", "e", "f"]
tupl_lst = list(itertools.product(l1, l2))
tupl_lst
Out[42]: 
[('a', 'd'),
 ('a', 'e'),
 ('a', 'f'),
 ('b', 'd'),
 ('b', 'e'),
 ('b', 'f'),
 ('c', 'd'),
 ('c', 'e'),
 ('c', 'f')]

我想删除所有以'a' 开头或以'f' 结尾的元组,这样我的输出将如下所示:

[('b', 'd'),
 ('b', 'e'),
 ('c', 'd'),
 ('c', 'e')]

最快的方法是什么?

【问题讨论】:

【参考方案1】:

您甚至可以跳过itertools.product(),只使用一个列表理解:

l1 = ["a", "b", "c"]
l2 = ["d", "e", "f"]

tupl_lst = [(x, y) for x in l1 for y in l2 if x!="a" and y!="f"]

#output
[('b', 'd'), ('b', 'e'), ('c', 'd'), ('c', 'e')]

【讨论】:

【参考方案2】:

使用列表理解:

[t for t in tupl_lst if t[0]!='a' and t[1]!='f']

filter

list(filter(lambda t: t[0]!='a' and t[1]!='f',tupl_lst))

【讨论】:

%timeit list(filter(lambda t: t[0]!='a' and t[1]!='f',tupl_lst)) 1.3 µs ± 10.2 ns 每个循环(平均值 ± 7 次运行的标准开发,每次 1000000 次循环)%timeit [t for t in tupl_lst if t[0]!='a' and t[1]!='f'] 665 ns ± 15.1 ns per loop(平均± 7 次运行的标准开发,每次 1000000 次循环)看起来简单的列表理解更快【参考方案3】:

通过遍历列表的各个部分,完全避免使用前缀 (a) 和后缀 (f)。

[(x, y) for x in l1[1:] for y in l2[:-1]]
# [('b', 'd'), ('b', 'e'), ('c', 'd'), ('c', 'e')]

【讨论】:

以上是关于Python - 通过列表中的前缀和后缀删除元组的主要内容,如果未能解决你的问题,请参考以下文章

Python中的元组(Tuple)

python 全栈 python基础 三元运算 字符编码 元组 集合 三级菜单优化!

python序列-元组

python的元组和列表的区别

Python在函数中使用*和**接收元组和列表

Python在函数中使用*和**接收元组和列表