Отображение списка в CSV с использованием циклов и словаря - PullRequest
0 голосов
/ 23 февраля 2020

я использую Python, и, похоже, у меня проблема с моим для l oop.

Итак, вот наборы данных, с которыми я работаю:

A) У меня есть этот CSV-файл, который содержит все данные автомобиля

enter image description here

B) У меня также есть Марка, чтобы Автомобиль (тип) в формате CSV, который выглядит следующим образом

enter image description here

Что мне нужно построить, так это построить еще один CSV, разбивающий каждую строку на его правильная марка и тип автомобиля. убедившись, что он точный (например, есть Camry L и Camry LE - иногда он тянет оба).

Это вывод, который я ищу:

enter image description here

Пока вот мой сценарий:

temp_car_list = []
reader_type = csv.DictReader(type_library)

with open(file_name) as Output_file:
    reader = csv.DictReader(Output_file)
    for row in reader:
        Title = row ["Item Name"]
        print (Title)
        for brand in brand_library_iterate:
            if brand in Title:
                Brand_Name = brand
                print(Brand_Name)
        #Get Type Library List
        for Car_type in reader_type:
            Brand_String = str(Brand_Name)
            print(Brand_String)
            type_list = temp_car_list.append(Car_type[Brand_String])
        print(temp_car_list)
        for car_type in temp_car_list:
            if car_type in Title:
                car_type_output = car_type
                print (car_type_output)
        temp_car_list.clear()

Logi c сценария:

1) Pull Title (например, черная Toyota Camry L)

2) Извлечь марку автомобиля из списка

3) С выхода № 2 - отобразить в #B (файл csv на рисунке)

Вот что я получаю (к сожалению):

enter image description here

То, что я заметил, является основной проблемой:

1) по какой-то причине Brand_Name не изменяется во второй или последующих строках. Таким образом, это застряло в Тойоте.

2) car_type_output вытаскивает и Camry L и Camry LE

1 Ответ

2 голосов
/ 24 февраля 2020

Вопрос : разбить каждую строку на правильную марку, цвет и тип автомобиля.

A = """Item Name
Black Toyota Camry L
Honda Accord Navy
Grey Toyota Corolla
Black Nissan Murano
Silver Toyota Camry LE
"""

B = """Toyota,Nissan,Honda
Camry L,Murano,Accord
Corolla,Rogue,Civic
Avalon,Pathfinder,CR-V
Highlander,Maxima,HR-V
Prius,Altima,
Camry LE,,
"""

  1. Простейший подход разбиение строк из файла A.
    из файла B только первая строка с брендами используется для обнаружения строки, находящейся вне заказа:
    Honda Accord Navy.
import io


def simple_split_title():
    # with open(<name of your file B>) as fh:
    with io.StringIO(B) as fh:
        brands = fh.readline().rstrip().split(',')

    # with open(<name of your file A>) as fh:
    with io.StringIO(A) as fh:
        _ = next(fh)
        for line in fh:
            title = line.rstrip()
            item = title.split(' ')

            if item[0] in brands:
                _color, _brand, _type, _last = len(item) - 1, 0, 1, len(item) - 1
            else:
                _color, _brand, _type, _last = 0, 1, 2, len(item)

            result = {'title': title, 
                      'brand': item[_brand], 
                      'color': item[_color], 
                      'type': ' '.join(item[_type:_last])}
            print(result)
Самый дорогой подход. Для этого требуется l oop dict из файла B дважды на строку из файла A.
Чтобы обнаружить строку не в порядке: Honda Accord Navy, два требуется сравнение строк.
import io, csv


def looping_dict():
    # with open(<name of your file B>) as fh:
    with io.StringIO(B) as fh:
        car_type = [_dict for _dict in csv.DictReader(fh)]

    # with open(<name of your file A>) as fh:
    with io.StringIO(A) as fh:
        _ = next(fh)
        for line in fh:
            title = line.rstrip()
            result = {'title': title, 'brand': '', 'color': '', 'type': ''}

            # Get brand
            for brand in car_type[0].keys():
                if brand in title:
                    result['brand'] = brand
                    title = title.replace(brand + ' ', '')
                    break

            # Get type
            for _type in car_type:
                if title.endswith(_type[brand]) or title.startswith(_type[brand]):
                    result['type'] = _type[brand]
                    title = title.replace(_type[brand], '')
                    break

            # Get color
            result['color'] = title.strip()

            print(result)
Математический подход с использованием теории множеств .
Список car_type зацикливается только один раз на строку файла A.
A extra условие для обнаружения строки с ошибкой: Honda Accord Navy, не обязательно.
Вы получаете совпадение, если set из title items равны superset из car_type[x].set.
import io, csv
from collections import namedtuple

def theory_of_sets():
    CarType = namedtuple('CarType', 'set brand type')
    car_type = []
    # with open(<name of your file B>) as fh:
    with io.StringIO(B) as fh:
        for _dict in csv.DictReader(fh):
            for brand, _type in _dict.items():
                _set = {brand} | set(_type.split(' '))
                car_type.append(CarType._make((_set, brand, _type)))

    # with open(<name of your file A>) as fh:
    with io.StringIO(A) as fh:
        _ = next(fh)

        for line in fh:
            title = line.rstrip()
            _title = title.split(' ')
            _items = set(_title)

            result = None

            for ct in car_type:
                if _items.issuperset(ct.set):
                    result = {'title': title, 
                              'brand': ct.brand, 
                              'color': (_items - ct.set).pop(), 
                              'type': ct.type}
                    break

            print(result)

Вывод : Все три примера выводят один и тот же вывод.

{'title': 'Black Toyota Camry L', 'brand': 'Toyota', 'color': 'Black', 'type': 'Camry L'}
{'title': 'Honda Accord Navy', 'brand': 'Honda', 'color': 'Navy', 'type': 'Accord'}
{'title': 'Grey Toyota Corolla', 'brand': 'Toyota', 'color': 'Grey', 'type': 'Corolla'}
{'title': 'Black Nissan Murano', 'brand': 'Nissan', 'color': 'Black', 'type': 'Murano'}
{'title': 'Silver Toyota Camry LE', 'brand': 'Toyota', 'color': 'Silver', 'type': 'Camry LE'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...