уникальная сортировка в питоне - PullRequest
1 голос
/ 02 июля 2011

Я новичок в python. Я хочу получить уникальную строку из файла file.txt. У меня есть такие данные, как ...

Tempranillo     Rioja_%28wine%29%23Wine_regions
Gr%C3%BCner_Veltliner       Czech_Republic_%28wine%29
Marsanne        California_%28wine%29
Carm%C3%A9n%C3%A8re     Wines_of_Chile
Carm%C3%A9n%C3%A8re     Washington_%28U.S._state%29
Gr%C3%BCner_Veltliner       Czech_Republic_%28wine%29

Итак, я попробовал следующий код:

import re
import string
import urllib

for line in open('file.txt', 'r').readlines():
    left, right = string.split(line)
    relation = string.split(line)


    dom = relation[0]
    rang = relation[1]

    dom = urllib.unquote(relation[0])
    dom = dom.replace('_', ' ')


    rang= urllib.unquote(relation[1])
    rang = rang.replace('_', ' ')

Как действовать дальше. Мне нужно получить уникальное совпадение (dom rang) в этом формате:

Tempranillo     Rioja (wine) Wine regions
Marsanne        California (wine)

Любая помощь будет принята с благодарностью. Спасибо!

Ответы [ 5 ]

4 голосов
/ 02 июля 2011

Чтобы отфильтровать дубликаты строк из файла, сделайте следующее:

with open("file.txt") as f:
    unique_lines = set(f)
1 голос
/ 02 июля 2011

Я бы порекомендовал использовать urllib2 - и функциональный стиль подходит для обработки строк, например:

import urllib2

def process_item(x):
    return urllib2.unquote(x).replace('_', ' ')

def process_line(line):
    return tuple(process_item(i) for i in line.split())

with open('t.txt', 'r') as infile:
    unique_wines = set(process_line(l) for l in infile)

for dom, rang in sorted(unique_wines):
    print dom, ':', rang
1 голос
/ 02 июля 2011

Ну, если я вас правильно понимаю:

Поставьте это перед открытием файла:

 wines = {}

Поместите это в последние строки внутри цикла:

# if the wine location does not exist in the wines dictionary
if not dom in wines:
    # create a set at that index. (sets, unlike lists, will discard duplicates)
    wines[dom] = set();
wines[dom].add(rang) #add the wine and assume the set will handle dupes.

Поместите это после цикла:

# Prints a list of all wines organized by region
for dom in wines:
    for wine in wines[dom]:
        print("{0}\t{1}".format(dom, wine))

Как примечание


Другой автор предложил это:

with open("file.txt") as f:
    unique_lines = set(f)

Это лучшее решение, если в строках нет лишних пробелов. Пожалуйста, попробуйте сначала его предложение.

0 голосов
/ 02 июля 2011
>>> from collections import *

>>> wines = """
... a b
... a b
... c d
... """.strip()

>>> lines = wines.splitlines()

>>> Counter(lines)
Counter({'a b': 2, 'c d': 1})
0 голосов
/ 02 июля 2011

Проверить установить и заморозить ; это должно начать вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...