本文将为您提供关于交换Python列表中元素的最快方法的详细介绍,我们还将为您解释python中交换列表元素的位置的相关知识,同时,我们还将为您提供关于perl–查找列表中最长元素的最快方式(执行时间
本文将为您提供关于交换Python列表中元素的最快方法的详细介绍,我们还将为您解释python中交换列表元素的位置的相关知识,同时,我们还将为您提供关于perl – 查找列表中最长元素的最快方式(执行时间)、python – 如何知道子列表中元素的索引、python – 检查String是否是列表中元素的串联、Python 编号列表中元素的出现次数的实用信息。
本文目录一览:- 交换Python列表中元素的最快方法(python中交换列表元素的位置)
- perl – 查找列表中最长元素的最快方式(执行时间)
- python – 如何知道子列表中元素的索引
- python – 检查String是否是列表中元素的串联
- Python 编号列表中元素的出现次数
交换Python列表中元素的最快方法(python中交换列表元素的位置)
有没有比在Python中交换两个列表元素更快的方法了
L[a], L[b] = L[b], L[a]
还是我不得不求助于Cython或Weave之类?
答案1
小编典典看起来Python编译器使用此构造优化了临时元组:
码:
import disdef swap1(): a=5 b=4 a, b = b, adef swap2(): a=5 b=4 c = a a = b b = cprint ''swap1():''dis.dis(swap1)print ''swap2():''dis.dis(swap2)
输出:
swap1(): 6 0 LOAD_CONST 1 (5) 3 STORE_FAST 0 (a) 7 6 LOAD_CONST 2 (4) 9 STORE_FAST 1 (b) 8 12 LOAD_FAST 1 (b) 15 LOAD_FAST 0 (a) 18 ROT_TWO 19 STORE_FAST 0 (a) 22 STORE_FAST 1 (b) 25 LOAD_CONST 0 (None) 28 RETURN_VALUE swap2(): 11 0 LOAD_CONST 1 (5) 3 STORE_FAST 0 (a) 12 6 LOAD_CONST 2 (4) 9 STORE_FAST 1 (b) 13 12 LOAD_FAST 0 (a) 15 STORE_FAST 2 (c) 14 18 LOAD_FAST 1 (b) 21 STORE_FAST 0 (a) 15 24 LOAD_FAST 2 (c) 27 STORE_FAST 1 (b) 30 LOAD_CONST 0 (None) 33 RETURN_VALUE
两个加载,一个ROT_TWO
和两个保存,而三个加载和三个保存。您不太可能找到更快的机制。
perl – 查找列表中最长元素的最快方式(执行时间)
#!/usr/bin/env perl use warnings; use 5.012; use List::Util qw(reduce); use List::Util::XS; my @array = qw( one two three four five six seven eight nine ten eleven ); my $l = reduce{ length($a) > length($b) ? $a : $b } @array; say $l;
解决方法
sub longest { my $max = -1; my $max_i = 0; for (0 .. $#_) { # for each index my $len = length $_[$_]; # only get length once per item if ($len > $max) { # save index and update max if larger $max = $len; $max_i = $_; } } $_[$max_i] # return the largest item }
如果你要运行上面的代码很多次,我建议嵌入子程序的正文.
编辑:
drewk的基准显示,上述代码中的数组索引有点瓶颈.再试一次,我终于找到了一种比reduce解决方案更快的方法:
sub fastest { my $max = -1; my $max_ref; for (@_) { if (length > $max) { # no temp variable,length() twice is faster $max = length; $max_ref = \$_; # avoid any copying } } $$max_ref }
这导致以下基准:
Rate longest drewk reduce fastest longest 44245/s -- -21% -30% -47% drewk 55854/s 26% -- -11% -33% reduce 63014/s 42% 13% -- -25% fastest 83638/s 89% 50% 33% --
python – 如何知道子列表中元素的索引
像这样:
L=[[1,2,3],[4,5,6]]
当元素为3时,我想成为输出:
output=[0][2]
解决方法
L=[[1,6],[2,3,4,3]] a = 3 print([(i,j) for i,x in enumerate(L) if a in x for j,b in enumerate(x) if b == a]) #[(0,2),(2,1),4)]
使用列表推导,您可以挖掘并返回所有子值.如果你需要更深入,只需继续链接列表理解或编写一个函数来完成它.
python – 检查String是否是列表中元素的串联
例如:
L = set(["a","ab","c","e"])
然后“abac”是L的子集的元素的有效串联
“aaaaaaa”也是一种有效的连接.
但“广告”不是因为“d”不在L.
解决方法
import re L = ["no","force","in","the","verse","can","stop","me"] # make this: "(?:no|force|in|the|verse|can|stop|me)*$" r = re.compile( "(?:" + "|".join(L) + ")*$") r.match("shiny") # -> None r.match("canme") # -> not None
这适用于给定的字符串集. re库中有一个函数引用字符串(转义| etc),以便您可以在运行时安全地创建这样的表达式.
r = re.compile( "(?:" + "|".join( re.escape(s) for s in L) + ")*$" )
无论子串出现多少次,它都会匹配;如果某些字符串是其他字符串的前缀,则可能会出现奇怪的结果,等等.它可能有令人讨厌的运行时.如果所有字符串在开头都很容易区分,那就不应该.
Python 编号列表中元素的出现次数
如何解决Python 编号列表中元素的出现次数?
在处理列表时遇到问题
试图弄清楚如果元素出现多次时如何编号,从第二次出现我想在“@”附近添加数字:
例如:
[''example@company.com'',''example@company.com'',''none@comapny.com'',''example@company.com'']
想要的输出:
[''example@company.com'',''example2@company.com'',''example3@company.com'']
到目前为止的代码:
count_apper=Counter(mails_list)
for values in count_apper.items():
for mail in mails_list:
if values[0]==mail:
number+=1
temp_var=mail.split("@")
temp_var[0]=temp_var[0]+f"{number}"
temp_var="@".join(temp_var)
print(temp_var)
number=1
输出:
example1@company.com
example2@company.com
example2@company.com
none2@company.com
解决方法
我的回答基于我认为的 collections.Counter()
。它将为您完成一些工作。
import collections
addresses = [''example@company.com'',''example@company.com'',''none@comapny.com'',''example@company.com'']
results = []
for address,count in collections.Counter(addresses).items():
# add a "first" address as is
results.append(address)
# If there were other occurrences add them
for i in range(1,count):
results.append(f"{i+1}@".join(address.split("@")))
print(results)
这应该给你:
[''example@company.com'',''example2@company.com'',''example3@company.com'',''none@comapny.com'']
,
您可以迭代列表并使用 dict
来跟踪特定地址的出现次数。要在 @
符号前添加文本,您可以使用 .split
的 str
方法。一种可能的实现如下所示。
addresses = [''example@company.com'',''example@company.com'']
occurence_count = {}
transformed = []
for a in addresses:
count = occurence_count.get(a,0) + 1
occurence_count[a] = count
name,domain = a.split(''@'')
if count > 1:
transformed.append(f''{name}{count}@{domain}'')
else:
transformed.append(a)
print(transformed)
,
试试这个
j=[''example@company.com'',''example@company.com'']
count=1
k=j.copy()
for i in range(len(j)):
if k.count(k[i])>1:
m=[char for char in j[i]]
m.insert(j[i].index(''@''),str(count)
)
count+=1
j[i]=''''.join(m)
print (j)
今天关于交换Python列表中元素的最快方法和python中交换列表元素的位置的讲解已经结束,谢谢您的阅读,如果想了解更多关于perl – 查找列表中最长元素的最快方式(执行时间)、python – 如何知道子列表中元素的索引、python – 检查String是否是列表中元素的串联、Python 编号列表中元素的出现次数的相关知识,请在本站搜索。
本文标签: