amccants Ответов: 2

Python, как подсчитать уникальные комметры в текстовом файле json?


Я работаю над кодом Python, который подсчитывает количество уникальных комментаторов в чате, используя их уникальный идентификатор, найденный в имени поля “_id”, вложенном в имя поля комментаторов. JSON выглядит примерно так.

формат JSON:
{ 
"_id":"123adfvssw",
"content_type":"video",
"content_id":"12345",
"commenter":{ 
"display_name":"student1",
"name":"student1",
"type":"user",
},
"source":"chat",
"state":"published",
"message":{ 
"body":"Hi",
"fragments":[ 
{ 
"text":"Hi"
}
],
"is_action":false
},
"more_replies":false
}

{ 
"_id":"123adfvssw",
"content_type":"video",
"content_id":"12345",
"commenter":{ 
"display_name":"student2",
"name":"student2",
"type":"user",
},
"source":"chat",
"state":"published",
"message":{ 
"body":"Hey!",
"fragments":[ 
{ 
"text":"Hey"
}
],
"is_action":false
},
"more_replies":false
}

{ 
"_id":"123adfvssw",
"content_type":"video",
"content_id":"12345",
"commenter":{ 
"display_name":"student1",
"name":"student1",
"type":"user",
},
"source":"chat",
"state":"published",
"message":{ 
"body":"How are you?",
"fragments":[ 
{ 
"text":"How are you?"
}
],
"is_action":false
},
"more_replies":false
}


In all, the topic received 3 commenters. However, student1 commented more than once. So in retrospect, there are only two unique commenters in this thread. My question is how do I ensure that I only count the unique commenters using their _id field in the JSON? I am able to count all the commenter fields in the text but I am unable to count the unique commenters. The initial code I wrote counts all the commenters field which prints 3. However, the real answer is 2 since student1 commented twice. I am now trying to put the commenter's _id in an array/list so that I can count the ids that are unique. However, I am having some trouble storing the multiple values through a loop. Please help if you can.

Что я уже пробовал:

Code that Prints Number of Commenters Field:

import json

import  requests

from collections import Counter

files ="/chatinfo.txt"

with open(files) as f:

    commenters = 0

    for line in f:

        jsondata = json.loads(line)

        if "commenter" in jsondata:

            commenters += 1


print(commenters)

Output
3


Покушение на получение комментатор поля значение поля _id в массив/список, чтобы сравнить и подсчитать только уникальные комментаторы поля _id:
import json
files = "/chatinfo.txt"
with open(files) as f:
	num_with_field = 0
	for line in f:
		jsondata = json.loads(line)
		dictjson = json.dumps(jsondata)
		if "commenter" in jsondata:
			commenterid = []
			commenterid.append(jsondata["commenter"]["_id"])
			print(commenterid)

Output:
			
['193984934']
['157255102']
['100365638']

____________

Однако после этого я пытаюсь посмотреть, что находится в массиве/списке. Я получаю ['100365638'] вместо всех трех значений.

print(commenterid)

Output

['100365638']


Из этих трех, похоже, только 1 значение было сохранено в массиве/списке commenterid.

Проблема 1:
Может ли кто-нибудь помочь мне заполнить мой массив/список тремя значениями, которые мне нужны, используя цикл? Массив/список должен содержать ['193984934']['157255102']['100365638'].

Задача 2:

Кроме того, как я могу подсчитать уникальные идентификаторы в этом массиве? До сих пор я видел только, как подсчитать частоту идентификаторов.

Counter(commenterid).values() # counts the elements' frequency.


Вы думаете
len(set(commenterid))
сработает ли это? Кроме того, если у вас есть лучший способ сделать это, кроме хранения нужных мне значений в массиве или списке, я бы хотел его увидеть. Заранее спасибо.

Richard Deeming

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

НЕ вандализируйте свой вопрос, чтобы удалить содержимое. Особенно после того, как кто-то любезно нашел время ответить на ваш вопрос!

Я отбросил ваш вандализм.

amccants

Окей. Я новичок в Codeproject, и я не думал, что это было большое дело, так как на этот вопрос никогда не было настоящего ответа. И когда я имею в виду "не ответил", я имею в виду "не ответил" таким образом, чтобы получить истинное решение. Никто не ответил на него, поэтому я удалил содержание, чтобы придумать более краткий способ задать вопрос. Поэтому, когда я решил задать вопрос по-другому, он не был помечен как дубликат. Не думаю, что я что-то испортил. Это мой код.

2 Ответов

Рейтинг:
1

Richard MacCutchan

Я сделал тебе предложение по адресу https://www.codeproject.com/Questions/1260731/How-do-I-count-the-unique-commeters-in-json-text-f[^Но по какой-то причине вы его удалили.


Рейтинг:
0

Mehdi Gholam

Вы должны использовать dictionary и проверьте, если ваш новый id был добавлен перед добавлением или вы могли бы просто увеличить счетчик для id: 5. структуры данных — документация Python 3.7.0[^]


amccants

Спасибо. Увеличение счетчика для идентификатора не приведет к созданию уникальных комментаторов. Я верю, что ваше первое предложение сработает. Я попробую это позже сегодня и дам вам знать.

Mehdi Gholam

Ключи в вашем словаре дадут вам уникальных комментаторов, подсчет-это бонус того, сколько раз для каждого человека.