Python 솔루션 주문

Python 솔루션 주문

예를 들어 in은 a:bc:d:a:hi:p:a중복 항목을 제거 a하고 in apple:orange:apple:.:pear:mango:.:apple-는 중복 항목을 제거합니다.apple

답변1

암소 비슷한 일종의 영양해결 방법(모든 구분 기호가 유지됨):

s="apple:orange:apple:.:pear:mango:.:apple"
awk '{ len=split($0,a,/:|:\.:/,seps); 
       for(i=1;i<=len;i++) printf "%s%s",(!w[a[i]]++? a[i]:""),(i==len? "":seps[i]);
       print "" }' <<<"$s"
  • len=split($0,a,/:|:\.:/,seps)- 문자열을 정규식 패턴으로 구분된 조각으로 분할 /:|:\.:/하고 조각을 배열에 저장 a하고 구분 기호 문자열을 seps배열에 저장합니다.

  • len- 분할로 인해 생성된 요소/블록의 개수를 포함합니다.


산출:

apple:orange::.:pear:mango:.:

답변2

Python 솔루션 주문

순서가 중요한 경우 Python의 한 줄의 코드로 다음을 수행할 수 있습니다.

$ python -c 'import sys;from collections import OrderedDict; d=OrderedDict( (i,True) for i in sys.argv[1].split(":") );print ":".join(d.keys())'  'apple:orange:apple:.:pear:mango:.:apple'
apple:orange:.:pear:mango

약간 길기 때문에 작은 스크립트로 작성할 수 있습니다.

#!/usr/bin/env python
from collections import OrderedDict
import sys
d=OrderedDict( (i,True) for i in sys.argv[1].split(":") )
print ":".join(d.keys())

다음과 같이 사용하십시오.

$ ./uniq_tokens.py 'apple:orange:apple:.:pear:mango:.:apple'                                                                                                           
apple:orange:.:pear:mango

작동 방식:

  • 처리하려는 문자열을 명령줄 인수로 제공하므로 sys모듈을 사용하여 참조합니다.sys.argv[1]
  • sys.argv[1]:구분 기호를 사용하여 토큰으로 분할
  • (i,True) for i in sys.argv[1].split(":")두 개의 값이 있는 튜플 목록을 만들 수 있습니다. 여기서는 True더미 값만 있습니다.
  • OrderedDict그런 다음 이를 가져와 키 값 쌍의 사전을 만듭니다. 이것은 그것을 만드는 "저렴한" 방법이다주문한 세트그리고목록 이해사전 이해의 대안으로. 문자열이 이미 키로 존재하는 경우 고유한 상태로 유지됩니다(불필요한 일을 하지 않는 이상)
  • ":".join()우리가 분할한 모든 토큰을 가져온 다음( d.keys()여기서 사용함) 이를 다시 멋진 전체 문자열로 변환하고 사용할 수 있습니다.:
  • 인쇄는 자명합니다.

순서가 없지만 더 짧은 Python 솔루션

순서가 중요하지 않은 경우 더 짧은 솔루션을 얻을 수 있습니다(그러나 이는 실제 적용보다 재미를 위한 것입니다. 아마도 99%의 시간 동안 토큰 순서를 유지하려고 할 것입니다).

$ python -c  'import sys;print ":".join(set(sys.argv[1].split(":")))'  'a:bc:d:a:hi:p:a'                                                                               
a:p:hi:d:bc

작동 방식은 간단합니다.

  • 필요한 문자열을 명령줄 인수로 전달하므로 import sys첫 번째 명령줄 인수를 다음과 같이 인용 해야 합니다.sys.argv[1]
  • 이제 두 번째 부분을 열어 보겠습니다. sys.argv[1].split(":") 처음에는 전체 문자열인 토큰 목록이 제공되며, 이를 :개별 토큰의 구분 기호 로 사용합니다.
  • set()위에서 언급한 문자열 목록을 가져와서 고유한 값을 제공합니다.
  • 이제 이 문자열 모음을 다시 완전한 문자열로 변환해야 합니다. 이것이 바로 구분 기호를 사용하여 ":".join()모든 토큰을 다시 연결하는 이유입니다.:
  • print자명하다. 이는 Python 2.7 구문입니다. print()파이썬 3 의 경우

다음은 다른 문자열을 사용한 테스트입니다.

$ python -c  'import sys;print ":".join(set(sys.argv[1].split(":")))'  'apple:orange:apple:.:pear:mango:.:apple'                                                       
orange:mango:pear:apple:.

답변3

Perl의 해시 데이터 유형을 사용하여 중복을 제거할 수 있습니다.

$ cat ./remove_dup.pl
#!/usr/bin/perl -w

use strict;

my $input = shift;
my %seen;

my $order=1;
foreach my $dir ( split /:/, $input ) {
        $seen{$dir} = $order++ unless ($seen{$dir})  ;
}
my $output =  join( ':',  sort { $seen{$a} <=> $seen{$b} } keys(%seen));
print $output . "\n";

데모:

$ ./remove_dup.pl a:bc:d:a:hi:p:a
a:bc:d:hi:p
$ ./remove_dup.pl apple:orange:apple:.:pear:mango:.:apple
apple:orange:.:pear:mango

답변4

일방 bash통행:

strjoin() { local IFS="$1"; echo "${*:2}"; }
dedup() {
    declare -A valbag
    IFS=: read -r -a vals <<<"$1"
    for ((i=0; i < ${#vals[@]}; i++)); do
        (( valbag[${vals[i]}]++ > 0 )) && vals[i]=''
    done
    strjoin : "${vals[@]}"
}

$ dedup apple:orange:apple:.:pear:mango:.:apple
apple:orange::.:pear:mango::
$ dedup 'a:bc:d:a:hi:p:a'
a:bc:d::hi:p:

이는 모든 콜론을 제자리에 유지하고 콜론 사이의 중복 항목만 지우라는 귀하의 의견 요구 사항을 충족합니다.

관련 정보