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