Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Perl中获得只有一个副本的项目列表?_Perl - Fatal编程技术网

如何在Perl中获得只有一个副本的项目列表?

如何在Perl中获得只有一个副本的项目列表?,perl,Perl,我有一个字符串列表,我需要删除所有唯一或有多个重复项的项目。换句话说,我只需要列表中正好两次的项目。如何在Perl中执行此操作?这是经典的删除重复项方法的特例。当项目是字符串时,在Perl 5中这非常容易: my %seen; for my $item (@list) { $seen{$item}++; } my @twice = grep { $seen{$_} == 2 } keys(%seen); 列表的大小是O(N),但我认为,如果不至少查看每个元素一次,就无法成功地完成这类

我有一个字符串列表,我需要删除所有唯一或有多个重复项的项目。换句话说,我只需要列表中正好两次的项目。如何在Perl中执行此操作?

这是经典的删除重复项方法的特例。当项目是字符串时,在Perl 5中这非常容易:

my %seen;
for my $item (@list) {
    $seen{$item}++;
}

my @twice = grep { $seen{$_} == 2 } keys(%seen);

列表的大小是O(N),但我认为,如果不至少查看每个元素一次,就无法成功地完成这类操作…

这是经典的删除重复项配方的特例。当项目是字符串时,在Perl 5中这非常容易:

my %seen;
for my $item (@list) {
    $seen{$item}++;
}

my @twice = grep { $seen{$_} == 2 } keys(%seen);

它在列表的大小上是O(N),但我认为,如果不至少查看每个元素一次,就无法成功地完成这类操作…

@Zaid::我使用哈希对其进行编码,以查找每个项在数组中的次数。。。但我相信这不是最好的方法。@Zaid::我用散列法对它进行编码,以找出每个项在数组中的次数。。。但我认为这不是最好的方法。实际上,解决方案是2*N。一次通过计数,另一次通过
grep
@stackoverflow。grep的测试(哈希查找和数字比较)非常快,所以我认为性能不会成为问题。使用循环实现任何东西都不会更快。您可以通过保留另一个哈希%twos来消除第二个过程:类似于:if($seen{$item}==2){$twos{$item}++}else{delete$twos{$item};}。。。那么答案就是键(%2)。这需要更多的周期,但由于缓存效应,对于答案集非常小的非常大的哈希可能会更快。实际上,解决方案是2*N。一次通过计数,另一次通过
grep
@stackoverflow测试grep的操作(哈希查找和数字比较)非常快,所以我不认为性能会成为问题。使用循环实现任何东西都不会更快。您可以通过保留另一个哈希%twos来消除第二个过程:类似于:if($seen{$item}==2){$twos{$item}++}else{delete$twos{$item};}。。。那么答案就是键(%2)。这需要更多的周期,但由于缓存效应,对于答案集非常小的非常大的散列可能会更快。