Я бы использовал словари Python, где ключи словаря являются значениями столбца A, а значения словаря являются встроенными в Python Тип набора содержит значения столбца B
def parse_the_file():
lower = str.lower
split = str.split
with open('f.txt') as f:
d = {}
lines = f.read().split('\n')
for A,B in [split(l) for l in lines]:
try:
d[lower(A)].add(B)
except KeyError:
d[lower(A)] = set(B)
for a in d:
print "%s - %s" % (a,",".join(list(d[a])))
if __name__ == "__main__":
parse_the_file()
Преимущество использованиясловарь - это то, что у вас будет один словарный ключ для каждого столбца.Преимущество использования набора состоит в том, что у вас будет уникальный набор значений столбца B.
Замечания по эффективности:
- Использование try-catch более эффективно, чем использование оператора if \ else для проверки начальных случаев.
- Оценка и назначениефункции str вне цикла более эффективны, чем простое их использование внутри цикла.
- В зависимости от соотношения новых значений A и повторного появления значений A в файле, вы можете рассмотреть возможность использования
a = lower(A)
перед оператором try catch - я использовал функцию, поскольку доступ к локальным переменным в Python более эффективен, чем к глобальным переменным
- Некоторые из этих советов по производительности взяты из здесь
Тестирование кода выше на вашем входном примере дает:
xxxd - 4
xxxa - 1,3,2
xxxb - 2
xxxc - 3