如何计算文件中唯一字符的数量?

Vil*_*age 5 ruby python bash perl

给定一个UTF-8文件,包含各种语言的字符,如何获得它包含的唯一字符数的计数,同时排除选定数量的符号(例如:"!","@","#" ,".")从这个计数?

tch*_*ist 8

这是一个bash解决方案.:)

bash$ perl -CSD -ne 'BEGIN { $s{$_}++ for split //, q(!@#.) }
                     $s{$_}++ || $c++ for split //;
                     END { print "$c\n" }' *.utf8
Run Code Online (Sandbox Code Playgroud)


agf*_*agf 5

在Python中:

import itertools, codecs

predicate = set('!@#.').__contains__
unique_char_count = len(set(itertools.ifilterfalse(
                      predicate, itertools.chain.from_iterable(codecs.open(filename, encoding="UTF-8")))))
Run Code Online (Sandbox Code Playgroud)

当您遍历文件时,您会获得行.chain将它们连接在一起,所以迭代它就可以得到字符.ifilterfalse消除符合条件的字符,条件定义为一组不允许字符的成员资格.

没有itertools:

import codecs
disallowed = set('!@#.')
unique_char_count = len(set(char for line in codecs.open(filename, encoding="UTF-8") for char in line 
                              if char not in disallowed))
Run Code Online (Sandbox Code Playgroud)

使用set操作:

import codecs
unique = set()
any(unique.update(line) for line in codecs.open(filename, encoding="UTF-8"))
unique.difference_update('!@#.')
unique_char_count = len(unique)
Run Code Online (Sandbox Code Playgroud)

  • 我认为你需要一个*或.from_iterable链才能以这种方式工作. (3认同)

tor*_*ing 3

使用 Perl 一行代码:

\n\n
echo -e "aba\\ncfg!\xe0\xb4\xa1.#g" | perl -C7 -ne \'for(split(//)){if ($_ !~ /[!@#.]/) { print $_."\\n"}}\' | sort | uniq | wc -l\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出 7

\n\n

如果你想忽略换行符:

\n\n
echo -e "aba\\ncfg!\xe0\xb4\xa1.#g" | perl -C7 -ne \'for(split(//)){if ($_ !~ /[!@#.\\n]/) { print $_."\\n"}}\' | sort | uniq | wc -l\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出 6

\n