Как посчитать количество уникальных символов в файле? - PullRequest
5 голосов
/ 24 марта 2012

Учитывая файл в UTF-8, содержащий символы на разных языках, как я могу получить счетчик количества уникальных символов, которые он содержит, исключая выбранное количество символов (например: "!", "@","#", ".") из этого числа?

Ответы [ 9 ]

8 голосов
/ 24 марта 2012

Вот решение Bash. :)

bash$ perl -CSD -ne 'BEGIN { $s{$_}++ for split //, q(!@#.) }
                     $s{$_}++ || $c++ for split //;
                     END { print "$c\n" }' *.utf8
5 голосов
/ 24 марта 2012

В 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")))))

Когда вы перебираете файл, вы получаете строки. 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))

Использование операций над множествами:

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)
3 голосов
/ 24 марта 2012

Еще один рубиновый:

#encoding: utf-8
string = '@étude#@étude ฒณ!'
ignore = '!@#.'
p string.chars.to_a.uniq.join.delete(ignore).size #=>8
3 голосов
/ 24 марта 2012

Ruby, используя наборы:

require 'set'
string = 'ababbbababbabcdcccdbbaaba'
ignore = 'c'
(Set.new(string.chars) - Set.new(ignore.chars)).count
# => 3 
  • string является строкой ввода
  • ignore - строка с символами, которые следует игнорировать
  • string.chars - список символов в строке
  • Set.new делает из него набор
  • - дает разницу между двумя наборами
  • count - количество элементов в результирующем наборе
2 голосов
/ 22 января 2013

Я сделал это в Python после 3 часов исследований, но я сделал это

fname = "temp.txt"
num_lines = 0
num_words = 0
num_chars = 0
num_uniq  = 0
a = []
exclude = ",.@#$"
with open(fname, 'r') as f:
    for line in f:
        words = line.split()
        for word in words:
                char = list(word)
                a = a + char
        num_lines += 1
        num_words += len(words)
        num_chars += len(line)
print "Lines:%s\nWords:%s\nChars:%s" % (num_lines, num_words, num_chars)
num_uniq =  len(set(a)-set(exclude))
print "Unique Characters:%d" % (num_uniq)

здесь вывод

Lines:6
Words:74
Chars:385
Unique Characters:26
2 голосов
/ 24 марта 2012

Я просто добавлю свой необязательный язык для хорошей меры:

sed 's/[!@#.]//g' /path/to/file | sed 's/./\0\n/g' | sort -u | wc -l
2 голосов
/ 24 марта 2012

Использование однострочного Perl:

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

ВЫХОД 7

Если вы хотите игнорировать перевод строки:

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

ВЫХОД 6

1 голос
/ 24 марта 2012

Используйте наборы в Python.Допустим, вы хотите найти уникальные символы в файле url.txt

f=open('url.txt')
a=''
for x in f:
    x=x.split(' ')
    for y in x:
     a+=y
unique=set(a)-set('@!#.')  #add the characters that you wanna neglect in the second set
print(unique)
print('unique characters : ',len(unique))

Допустим, url.txt содержит:

Google --!  google.com  --!  coolest search engine 

facebook --!  facebook.com  --!  biggest social network 

yahoo --!  yahoo.com  --!  biggest web portal 

вывод будет:

{'a', 'G', 'm', '\n', 'n', 'c', 'b', 'e', 'g', 'f', 'i', 'h', 'k', '-', 'l', 'o', 'p', 's', 'r', 't', 'w', 'y'}
unique characters :  22
0 голосов
/ 24 марта 2012

Одна альтернатива:

filename='/somewhere/my-file-in-utf8'

iconv -f UTF8 -t UTF16 $filename | tail -c +3 |  \
perl -pi -e "s/\x00\@//g; s/\x00\!//g; s/\x00\#//g; s/\x00\.//g;" | \
od | cut -b 8- | xargs -n 1 | sort | uniq | wc -l
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...