GVKun编程网logo

交换Python列表中元素的最快方法(python中交换列表元素的位置)

8

本文将为您提供关于交换Python列表中元素的最快方法的详细介绍,我们还将为您解释python中交换列表元素的位置的相关知识,同时,我们还将为您提供关于perl–查找列表中最长元素的最快方式(执行时间

本文将为您提供关于交换Python列表中元素的最快方法的详细介绍,我们还将为您解释python中交换列表元素的位置的相关知识,同时,我们还将为您提供关于perl – 查找列表中最长元素的最快方式(执行时间)、python – 如何知道子列表中元素的索引、python – 检查String是否是列表中元素的串联、Python 编号列表中元素的出现次数的实用信息。

本文目录一览:

交换Python列表中元素的最快方法(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 – 查找列表中最长元素的最快方式(执行时间)

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;

解决方法

当只尝试找到一个列表的一个元素时,不需要构建一个N大小的数据结构,这里的许多答案已经完成.最快的O(N)方法是走数组,跟踪最大的元素.这样你有O(N)访问列表,和O(1)内存使用.
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 – 如何知道子列表中元素的索引

python – 如何知道子列表中元素的索引

你怎么知道子列表中元素的索引? A similar question was asked here表示没有嵌套的列表

像这样:

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是否是列表中元素的串联

python – 检查String是否是列表中元素的串联

是否有一种优雅的方式(最好是 pythonic)来检查String s是否是一组L的子集的元素串联? L的元素可能在s中出现不止一次.

例如:

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 编号列表中元素的出现次数

如何解决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 来跟踪特定地址的出现次数。要在 @ 符号前添加文本,您可以使用 .splitstr 方法。一种可能的实现如下所示。

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 编号列表中元素的出现次数的相关知识,请在本站搜索。

本文标签: