统计列表频数且写入一个列表内的Python代码
时间: 2023-06-19 16:07:14 浏览: 52
假设我们有一个列表`my_list`,我们要统计其中每个元素的出现次数,并将结果存储在一个新的列表`freq_list`中,可以使用Python的内置函数`count()`来实现:
```python
my_list = [1, 2, 2, 3, 3, 3]
freq_list = []
for elem in my_list:
freq_list.append(my_list.count(elem))
print(freq_list)
```
输出结果为`[1, 2, 2, 3, 3, 3]`,即每个元素在原列表中出现的次数。注意这个方法的时间复杂度为O(n^2),因为对于每个元素,都需要遍历一次整个列表来统计其出现次数。如果列表很大,这个方法可能会比较慢,可以考虑使用其他的数据结构来优化。
相关问题
多线程读取文件夹统计每个文件的字母频数并写入文本
可以使用Python的`os`和`threading`模块来实现多线程读取文件夹并统计每个文件的字母频数并写入文本的功能。
以下是一个简单的实现:
```python
import os
import threading
# 定义一个字典用于保存字母频数
freq_dict = {}
# 定义一个锁,用于线程间同步
lock = threading.Lock()
# 定义一个函数用于统计单个文件的字母频数
def count_freq(file_path):
global freq_dict, lock
with open(file_path, 'r') as f:
text = f.read().lower()
for char in text:
if char.isalpha():
with lock:
freq_dict[char] = freq_dict.get(char, 0) + 1
# 定义一个函数用于遍历文件夹并启动线程
def traverse_folder(folder_path):
thread_list = []
for root, dirs, files in os.walk(folder_path):
for file in files:
file_path = os.path.join(root, file)
t = threading.Thread(target=count_freq, args=(file_path,))
t.start()
thread_list.append(t)
for t in thread_list:
t.join()
# 定义一个函数用于将结果写入文本
def write_result(result_path):
global freq_dict
with open(result_path, 'w') as f:
for char in sorted(freq_dict.keys()):
f.write(f"{char}: {freq_dict[char]}\n")
# 测试代码
if __name__ == '__main__':
folder_path = 'path/to/folder'
result_path = 'path/to/result.txt'
traverse_folder(folder_path)
write_result(result_path)
```
首先,定义一个全局的字典`freq_dict`用于保存字母频数。然后定义一个锁`lock`用于线程间同步。接着定义`count_freq`函数用于统计单个文件的字母频数,该函数使用了`with lock`语句确保字典的更新操作是线程安全的。再定义`traverse_folder`函数用于遍历文件夹并启动线程,该函数使用了`os.walk`函数遍历文件夹,对于每个文件都启动一个线程来统计字母频数。最后定义`write_result`函数用于将结果写入文本,该函数按字母顺序将结果写入文本文件中。
在测试代码中,设置了文件夹路径`folder_path`和结果文件路径`result_path`,并依次调用`traverse_folder`和`write_result`函数来完成任务。注意,由于涉及多线程操作,应当在`if __name__ == '__main__':`语句中执行测试代码,以避免子线程被重复创建。
多进程读取文件夹统计每个文件的单词频数并写入文本
可以使用Python的multiprocessing模块来实现多进程读取文件夹,并使用collections模块来统计单词频数。具体代码如下:
```python
import os
import multiprocessing
from collections import Counter
def count_words(file_path):
with open(file_path, 'r') as f:
words = f.read().split()
return Counter(words)
def write_result(result, output_file):
with open(output_file, 'w') as f:
for word, count in result.items():
f.write(f"{word}: {count}\n")
def main(input_dir, output_file, num_processes):
pool = multiprocessing.Pool(processes=num_processes)
results = []
for dirpath, _, filenames in os.walk(input_dir):
for filename in filenames:
file_path = os.path.join(dirpath, filename)
results.append(pool.apply_async(count_words, args=(file_path,)))
pool.close()
pool.join()
final_result = Counter()
for result in results:
final_result += result.get()
write_result(final_result, output_file)
if __name__ == '__main__':
input_dir = '/path/to/input/directory'
output_file = '/path/to/output/file'
num_processes = 4
main(input_dir, output_file, num_processes)
```
首先定义了一个`count_words`函数,用于统计单个文件的单词频数。该函数接收一个文件路径作为参数,打开文件并读取所有单词,然后使用Counter类统计每个单词出现的次数,并返回结果。
接下来定义`write_result`函数,用于将统计结果写入文件。该函数接收一个Counter对象和输出文件路径作为参数,遍历Counter对象中的每个元素,并将其写入输出文件中。
最后定义`main`函数,用于处理整个程序的流程。该函数接收三个参数:输入文件夹路径、输出文件路径和进程数。首先创建一个进程池,然后遍历输入文件夹中的所有文件,将每个文件的统计任务添加到进程池中。添加完成后关闭进程池并等待所有任务完成。最后将所有任务的统计结果合并,并将合并后的结果写入输出文件中。
在`main`函数中,可以通过修改`num_processes`参数来控制使用的进程数。建议使用与CPU核心数相同的进程数以获得最佳性能。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![md](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)