Как я могу объединить числовые значения похожих строк?

У меня есть список лицензий и связанных с ними счетчиков лицензий, например:

1 Third Party SIP Device Seat   
1 Third Party SIP Device Seat   
1 Third Party SIP Device Seat   
3 Station   
3 Station   
3 Station   
20 Station

Списки никогда не находятся в одном и том же порядке, и мне просто нужно добавить итоги для каждого типа лицензии, поэтому в примере я хотел бы получить результат:

3 Third Party SIP Device Seat
29 Station

Данные вводятся в несохраненный блокнот, а затем перемещаются в базу данных. Использование Excel неприменимо, так как это пробелы между числами и именами, а не вкладки.

Каким будет самый простой способ выполнить эту задачу?

Ну, вы можете указать Excel разделить ваши данные по пробелу или любому другому разделителю по вашему выбору.

Will 30.05.2019 17:49

«Каким будет самый простой способ выполнить эту задачу?» Использование python для автоматизации всего этого звучит как простой способ выполнить задачу.

TrebledJ 30.05.2019 17:51

Вы можете использовать пакет python pandas. Как заявил @Will, большинство инструментов, включая pandas и excel, могут использовать любой разделитель для чтения текстового файла.

iamchoosinganame 30.05.2019 17:51

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

Kevin Burris 30.05.2019 17:53

@TrebledJ Это цель, я просто не знаю, как это сделать. Какую библиотеку я бы использовал?

Kevin Burris 30.05.2019 17:54

Прочитайте строки файла, разбейте каждую по индексу первого пробела, проанализируйте число как целое и создайте словарь лицензии для общего количества. Идти!

Blorgbeard 30.05.2019 17:57

itertools имеет группу. не нужны панды

Will 30.05.2019 18:00
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
59
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вот супер уродливое решение:

from functools import reduce
from collections import defaultdict

lines = [       # replace with e.g: with open('input.txt', 'r') as f: lines = f.readlines()
  "1 Third Party SIP Device Seat",   
  "1 Third Party SIP Device Seat",  
  "1 Third Party SIP Device Seat", 
  "3 Station",
  "3 Station",  
  "3 Station",  
  "20 Station"
]

def f(acc, x):
  acc[" ".join(x.split(" ")[1:])] += int(x.split(" ")[0]) # first element is the count, everything after we use as "key"
  return acc

r = dict(reduce(f, lines, defaultdict(int)))

print(r)
# {'Third Party SIP Device Seat': 3, 'Station': 29}

# to write to file:
with open("output.txt", "w") as f:  
  for k, v in r.items():
    f.write(str(v) + " " + str(k))

Мне нравится использовать defaultdict и уменьшить. умная

Will 30.05.2019 18:07

@Jeppe Так что это идеально, именно то, что я искал. Я добавил еще несколько шагов к обработке данных, чтобы заставить ее работать, в основном добавляя первую вкладку для каждой строки, а также кавычки и запятую в конце, и все работает как часы. С учетом сказанного можно ли извлечь данные в новый файл Word? Таким образом, я мог бы автоматически сохранять данные для каждой компании в их собственном текстовом документе с именем файла, которое я каждый раз задавал в коде? Кроме того, вместо разделения записей можно использовать новую строку? Я очень ценю помощь.

Kevin Burris 30.05.2019 22:09

Мне действительно просто нужно иметь возможность сохранить в документ Word, оттуда я могу просто найти и заменить каждый на новую строку.

Kevin Burris 30.05.2019 22:17

@KevinBurris Я добавил код для записи содержимого в файл. Вы можете изменить разделитель и т. д. в строке, построенной в строке f.write(str(v) + " " + str(k)). Это то, что вы имеете в виду?

Jeppe 30.05.2019 22:29

Большое вам спасибо за вашу помощь! Я изменил последнюю строку следующим образом: f.write(str(v) + " " + str(k) + "\n"), и теперь я получаю все, что мне нужно! Теперь, когда мой проект работает, я могу полностью автоматизировать процесс и потратить некоторое время на изучение того, как работает этот код и код из других ответов. Я очень ценю, что вы нашли время, чтобы помочь мне, когда я углубляюсь в Python!

Kevin Burris 30.05.2019 22:47

@KevinBurris Нет проблем, не стесняйтесь спрашивать об обратном. Функцию f(acc, x), вероятно, можно немного почистить.

Jeppe 30.05.2019 23:04

Вы хотите группу. К счастью, у itertools есть один

from itertools import groupby 

text = """1 Third Party SIP Device Seat    
1 Third Party SIP Device Seat    
1 Third Party SIP Device Seat    
3 Station    
3 Station    
3 Station    
0 Station""" 

# clean stuff up and split on first space
lines = [line.strip().split(" ", 1) for line in text.split("\n")]

# groupby
result = []
for k, g in groupby(lines, lambda x: x[1]): 
    total = 0 
    for i in g: 
        total += int(i[0]) 
    result.append([k, total])  
print(result)

Полное решение с данными в «сохраненном файле блокнота» с именем licences.txt:

from collections import Counter
counter=Counter()
with open ('licences.txt','r') as f:
    for line in f:
        count,*words = line.split()
        counter[" ".join(words)] += int(count)

with open('grouped_licences.txt','w') as f:
    for licence,total in counter.items():
        f.write(str(total) + " " + licence + "\n")        

Тогда результат в файле grouped_licences.txt:

    3 Third Party SIP Device Seat 
    29 Station

Другое решение с pandas :

df=pandas.read_csv('licences.txt', sep = " ",header=None).fillna("")        
df["licence"]=df.iloc[:,1:].apply(" ".join,axis=1)        
print(df.groupby("licence")[0].sum())        

Для :

licence
Station                           29
Third Party SIP Device Seat        3

Другие вопросы по теме