Как я могу найти процент элементов в списке? (Python) - PullRequest
0 голосов
/ 17 апреля 2020

Я новичок в python и столкнулся с проблемой в моем проекте. Я должен прочитать файл, содержащий пользователей + задачи. Затем я должен перечислить имена пользователей, и посчитать количество имен были перечислены в файле .. сгруппированы вместе. Затем, как только я получу счетчик, вычислите процент этого количества с количеством пользователей в списке.

содержимое файла выглядит следующим образом:

user1, task
user2, task
user1, task
user4, task
user4, task
user1, task

Вот мой код -

with open('tasks.txt', 'r') as tasks:
    for line in tasks.readlines():
        mine = line.lower().split(", ")
        for i in mine[0].split(", "):
            cnt[i] += 1
    print("\nThese are the number of tasks assigned to each user: \n" + str(cnt))
    t = sum(cnt.values())
    d = dict(cnt)
    u, v = zip(*d.items())
    print(u, v)
    for n in v:
        divide = float(n / t) * 100
        print("The users are assigned this percentage of the tasks: \n")
        print(n, divide)

* Я бы хотел, чтобы результаты выглядели так: user1: 3, 50% user4: 2, 33% user2: 1, 16,7%

Если у кого-то есть предложения, пожалуйста, дайте мне знать

Ответы [ 4 ]

2 голосов
/ 17 апреля 2020

код:

cnt={}
usertask = []
res = {}
with open('task.txt', 'r') as tasks:
    for line in tasks.readlines():
        mine = line.lower().split(", ")
        usertask.append(mine[0])

for i in (list(set(usertask))):
    cnt[i]=0

for user in usertask:
    cnt[user]+=1

for user,task in cnt.items():
    res[user]=task*(100/len(usertask))

print(res)
1 голос
/ 17 апреля 2020

Вы можете попробовать это:

# read data to a list
with open('tasks.txt', 'r') as f:
    lines = f.readlines()
    lines = [line.strip() for line in lines]

Оригинальный способ:

from collections import defaultdict
count = defaultdict(list)
for line in lines:
    user, task = line.split(', ')
    count[user].append(task)
for user, tasks in count.items():
    print(f'{user}: {len(tasks)*100/len(lines)}%')

Или более быстрый способ - использовать Counter:

from collections import Counter
users = [line.split(', ')[0] for line in lines]
count = Counter(users)
for user, value in count.items():
    print(f'{user}: {value*100/len(lines)}%')
0 голосов
/ 17 апреля 2020

Несмотря на то, что есть много полезных знаний о том, как использовать базовые c python типы, большое преимущество python, с моей точки зрения, заключается в огромном количестве доступных библиотек, которые решают большое количество общих проблемы уже есть.

Если вы собираетесь часто управлять и преобразовывать файлы данных в этом проекте, рассмотрите возможность использования библиотеки.

import pandas   #import the pandas library
df = pandas.read_csv('tasks.txt', header=None, names=['user', 'task']) #read you file into a dataframe, which is a table like object
df['user'].value_counts(normalize=True).mul(100) #count the number of users, where the parameter normalize gives each count as a fraction, then mul (short for multiply) by 100 to turn the fraction into a percentage.

0 голосов
/ 17 апреля 2020

Вы можете просто сохранить все задачи одного пользователя в словаре, используя list в качестве значения для добавления каждого входящего такта.

Количество задач на пользователя - это длина этого списка. Все задачи - это сумма всех длин:

fn = "d.txt"

# write demo data
with open (fn,"w") as f:
    f.write("""user1, task
user2, task
user1, task
user4, task
user4, task
user1, task""")

from collections import defaultdict

# use a dicts with values that default to list
users=defaultdict(list)

with open(fn) as tasks:
    for line in tasks:
        # split your line into 2 parts at 1st ',' - use 1st as user, 2nd as task-text
        user, task = line.strip().lower().split(", ",1)

        # append task to user, autocreates key if needed
        users[user].append(task)

    # sum all lenght values together
    total_tasks = sum(map(len,users.values()))

    # how much % equals one assigned task?
    percent_per_task = 100 / total_tasks

    for user, t in users.items():
        # output stuff
        lt = len(t)
        print(user, lt, (lt * percent_per_task),'%')

Вывод:

user1 3 50.0 %
user2 1 16.666666666666668 %
user4 2 33.333333333333336 %
...