2015-09-29 3 views
3

Я пытаюсь создать уникальный список объектов с помощью Python, и я терпит неудачу. Не имеет значения, пользуюсь ли я списком или набором, он не работает. Когда я распечатал список/набор, я заметил пару неидеальных объектов в списке. Я понял, что это так, потому что у некоторых из этих объектов было «пространство» в начале слова. Я оглянулся и подумал, что использовать lstrip ('') · поможет мне, но, к сожалению, это не так.Уникальный список объектов в Python не работает

Самое странное, что «количество уникальных объектов» является правильным, но список уникальных объектов, созданных в конце, неверен. Может ли кто-нибудь указать мне, где я ошибаюсь?

Столбец Я заинтересован в это 'объект' и уникальный список должен содержать Owl, Cat, Fox, Корова, Коза, Собака, Ant, Buffalo, Lion и tiger.

Образец данных:

Key ID Name Code State Object 
01  NULL NULL NULL NULL  Athletics, Light,Netball 
02  NULL NULL NULL NULL  BMX Track, Gridiron, Oval 
05  NULL NULL NULL NULL  Dog park, Cricket, Soccer 
10  NULL NULL NULL NULL  Netball, Oval, Softball 
21  NULL NULL NULL NULL  Seat, Playground, Ping Pong Table 
13  NULL NULL NULL NULL  Bench, Bike Rack, Seat 

Мой рабочий код прилагается ниже:

import csv 

fOpen1=open('C:\Data.csv') 
uniqueList=csv.writer(open('C:\UniqueList.csv', 'wb')) 

Master=csv.reader(fOpen1) 
Master.next() 

unique=[] 

for row in Master: 
    for item in row[5].split(','): 
     item.strip(' ') 
     if item not in unique: 
      unique.append(item) 
uniqueList.writerow(unique) 

Что я получаю в конце это дубликаты, включая 2 лис и не хватает нескольких уникальных записей, как Что ж. Конечно, это просто фиктивные данные, но я надеюсь, что я ясно объясню, что происходит.

UPDATE1: Я обновил сценарий, и он работает нормально, но возникла другая проблема. Я обновил столбец с реальными данными, с которыми я работаю. Уникальные предметы, которые не добавлены в окончательный список включают в себя:

Gridiron 
Cricket 
Ping Pong Table 
Softball 

UPDATE2:

Я вернулся к первоначальному «неправильному» сценарию, потому что он работает хорошо сейчас. В файле csv, над которым я работал, что-то не так.

Благодаря

ответ

4

str.lstrip(' ') не является методом на месте, он возвращает зачищенный строку. Вы должны назначить его обратно object -

object = object.lstrip(' ') 

Предполагая, что Python 2.7+ (или 3.1+), более быстрый способ будет использовать set, и, возможно, set comprehension. Пример -

unique = {obj.lstrip() for row in Master for obj in row[5].split(',')} 
uniqueList.writerow(list(unique)) 

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

unique=[] 
seen_set = set() 
for row in Master: 
    for obj in row[5].split(','): 
     obj = obj.lstrip(' ') 
     if obj not in seen_set: 
      unique.append(obj) 
      seen_set.add(obj) 

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


Кроме того, кажется, что есть некоторые строки с пробелами в конце, так что было бы лучше использовать .strip() или .strip(' ') вместо .lstrip(' '). Пример strip с множеством понимания -

unique = {obj.strip() for row in Master for obj in row[5].split(',')} 
uniqueList.writerow(list(unique)) 
+0

@ AnandSKumar- Спасибо за понимание , Однако теперь у меня другая проблема. Хотя я избавился от конечных пробелов, количество уникальных записей является неполным в моем конечном списке. В моем файле, который я работаю, есть 30 уникальных записей. После внесения изменений, как было предложено, оно дошло до 21. Любая идея, что может здесь происходить? Еще раз, спасибо! – VGu

+0

Вы проверили, какие конкретные данные отсутствуют? Кажется, у них есть какая-то связь? Может быть, они не находятся в поле «Объект»? –

+0

@ AnandSKumar- я проверил вручную и не вижу общей связи между отсутствующими элементами, т. Е. Нет связи. Они все определенно находятся в поле Object, когда я проверяю исходный файл, с которого я работаю. Это сбивает с толку. – VGu

1

Набор понимание будет служить вам хорошо.

Во-первых, давайте избавиться от этого открытого файла с помощью менеджера контекста:

import csv 

with open('C:\Data.csv') as raw: 
    master = csv.reader(raw) 
    master.next() # Ignore the header 
    unique = {y.strip() for row in master for y in row[-1].split(',')} 

Хорошо, давайте идти за то, что мы там делали. Мы открыли файл с помощью диспетчера контекстов, чтобы файл автоматически закрывался. Затем мы читаем в csv с помощью csv.reader и повторяем предыдущую строку.

Вот где это сложно: мы создали набор, итерируя по спискам в csv, а затем итерируя содержимое этих списков. Более подробный способ:

unique = set() 
for row in master: 
    for item in row[-1].split(','): 
     unique.add(item.strip()) 

Это делает то же самое, возможно, в более удобном для понимания формате. Кроме того, обратите внимание, что я использовал -1 для среза до последнего столбца в csv.

2

редактировать код что-то вроде этого:

for object in row[5].split(','): 
     object=object.strip() 
     if object not in unique: 
      unique.append(object) 

полоса будет удалить все пробелы справа и left.and присвоить объект в новый объект, как

object = object .strip() 
Смежные вопросы