def avg_freq_from_files(fnames):
assert(len(fnames))
freqs = [count_freq_for_str(open(i).read()) for i in fnames]
cmn_keys = set(freqs[0].keys())
for i in freqs[1:]:
cmn_keys = cmn_keys.intersection(set(i.keys()))
def avg_fr(n):
return avg([i[n] for i in freqs])
freq = dict((k, avg_fr(k)) for k in cmn_keys)
return freq
Перевод с Python на C++
Очень нужна помощь в переводе с Python на С++.
Помогите разобраться!!!
вот исходный код на Python
Код:
На входе vector<string> - в векторе записаны имена файлов.
На выходе map<int, double>
то что получается в C++
Код:
const std::map<int, double> avg_freq_from_files(std::vector<string> &fnames)
{
std::map<int, double> freq, f1;
std::vector< std::map<int,double> > freqs;
std::set<int> cmn_keys, cmn_keys1;
std::vector<string> words;
size_t i;
string str;
char s;
string word;
if (fnames.size() == 0)
exit(1);
for (i=0; i<fnames.size(); i++)
{
ifstream input_file(fnames.c_str(), ifstream::in );
while (! input_file.eof())
{
s = input_file.get();
if ((s>='a' && s<='z')||(s>='A' && s<='Z'))
{
word += s;
}
else
{
if (word.size() != 0)
{
f1 = count_freq_for_str<int>(word);
freqs.push_back(f1);
}
word.clear();
}
}
input_file.close();
}
cmn_keys = get_keys(freqs[0]);
//?????
for(i=1; i<freqs.size(); i++)
{
std::set<int> cmn_keys2;
cmn_keys1 = get_keys(freqs);
set_intersection(cmn_keys.begin(), cmn_keys.end(), cmn_keys1.begin(), cmn_keys1.end(),
inserter(cmn_keys2, cmn_keys2.begin()));
cmn_keys = cmn_keys2;
}
for (i = 0; i<cmn_keys.size(); i++)
{
freq.insert(std::pair<int, double> (i, avg_fr(i, freqs)));
}
return freq;
}
{
std::map<int, double> freq, f1;
std::vector< std::map<int,double> > freqs;
std::set<int> cmn_keys, cmn_keys1;
std::vector<string> words;
size_t i;
string str;
char s;
string word;
if (fnames.size() == 0)
exit(1);
for (i=0; i<fnames.size(); i++)
{
ifstream input_file(fnames.c_str(), ifstream::in );
while (! input_file.eof())
{
s = input_file.get();
if ((s>='a' && s<='z')||(s>='A' && s<='Z'))
{
word += s;
}
else
{
if (word.size() != 0)
{
f1 = count_freq_for_str<int>(word);
freqs.push_back(f1);
}
word.clear();
}
}
input_file.close();
}
cmn_keys = get_keys(freqs[0]);
//?????
for(i=1; i<freqs.size(); i++)
{
std::set<int> cmn_keys2;
cmn_keys1 = get_keys(freqs);
set_intersection(cmn_keys.begin(), cmn_keys.end(), cmn_keys1.begin(), cmn_keys1.end(),
inserter(cmn_keys2, cmn_keys2.begin()));
cmn_keys = cmn_keys2;
}
for (i = 0; i<cmn_keys.size(); i++)
{
freq.insert(std::pair<int, double> (i, avg_fr(i, freqs)));
}
return freq;
}
функция get_keys вытаскивает ключи Мапа
не могу понять как перевести строчку:
Код:
for i in freqs[1:]:
cmn_keys = cmn_keys.intersection(set(i.keys()))
cmn_keys = cmn_keys.intersection(set(i.keys()))
если что-то делаю не правильно, пожалуйста, объясните!
мозг уже кипит, спасибо за понимание!
Цитата: _LiS_
не могу понять как перевести строчку:
Код:
for i in freqs[1:]:
cmn_keys = cmn_keys.intersection(set(i.keys()))
cmn_keys = cmn_keys.intersection(set(i.keys()))
Так вроде сделал же. Что не работает в коде ниже?
Цитата: _LiS_
Код:
for(i=1; i<freqs.size(); i++)
{
std::set<int> cmn_keys2;
cmn_keys1 = get_keys(freqs);
set_intersection(cmn_keys.begin(), cmn_keys.end(), cmn_keys1.begin(), cmn_keys1.end(),
inserter(cmn_keys2, cmn_keys2.begin()));
cmn_keys = cmn_keys2;
}
{
std::set<int> cmn_keys2;
cmn_keys1 = get_keys(freqs);
set_intersection(cmn_keys.begin(), cmn_keys.end(), cmn_keys1.begin(), cmn_keys1.end(),
inserter(cmn_keys2, cmn_keys2.begin()));
cmn_keys = cmn_keys2;
}