2015-05-23 4 views
0

Вот моя функция поиска местоположения определенных значений на листе Excel.Uncool List Comprehension

from xlwings import Workbook, Range 

workbook = Workbook('workbook location') 

def get_data_locations(): 
    """ Find data locations from the first sheet in document. """ 
    first_sheet = Range('Sheet1', 'A1:Z200').value 
    coordinates = [] 
    for x in range(len(first_sheet)): 
     coordinate_pair = [[x + 1, y + 1] for y, z in enumerate(first_sheet[x]) if z == 'CO'] 
     if not coordinate_pair == []: 
      coordinates.append(coordinate_pair) 
    coordinates = [cp for [cp] in coordinates] 
    print(coordinates) 

Насколько я могу судить, код работает по назначению. Однако по какой-то причине мне кажется, что я убиваю щенков здесь.

Например, добавление вложенного списка здесь кажется излишним.

И требуется еще одна строка кода, чтобы удалить эту глупость.

coordinates = [cp for [cp] in coordinates] 

Я действительно очарован красотой Python и был бы признателен за любую помощь в том, чтобы сделать мой собственный код еще более очаровательным.

Спасибо!


Прохладный список понимание:

def get_data_locations(): 
    """ Find data locations from the first sheet in document. """ 
    first_sheet = Range('Sheet1', 'A1:Z200').value 
    coordinates = [] 
    for row_i, row in enumerate(first_sheet, 1): 
     coordinates.extend([(row_i, col_i) for col_i, col in enumerate(row, 1) if col == 'CO']) 
    return coordinates 

Большое спасибо Mike Müller, который придумал с этим решением! Я повторно опубликовал слегка измененную версию своего кода, чтобы выявить ценность предложения BBrown. Наличие значимых имен делает мир различий для новичка, подобного мне.

+0

Есть ли только одна ячейка в каждой строке, которая имеет значение «CO»? – inspectorG4dget

+0

Можете ли вы опубликовать самодостаточный пример, который фактически выполняется; с импортом и всем. Это упростит эксперимент с вашим подходом. –

+0

@ inspectorG4dget 'CO' может появляться несколько раз в одной строке. – Kristjan

ответ

0

В Python 2.7 и выше, это должно работать:

def get_data_locations(): 
    """ Find data locations from the first sheet in document. """ 
    first_sheet = Range('Sheet1', 'A1:Z200').value 
    coordinates = [] 
    for x, row in enumerate(first_sheet, 1): 
     coordinates.extend([[x, y] for y, z in enumerate(row, 1) if z == 'CO']) 
    return coordinates 

метод extend() добавляет элементы списка (или итератор) в другой список. Это как раз несколько звонков на append().

Начиная с Python 2.7 enumerate() принимает необязательный индекс начала. Таким образом, вам не нужны +1 в x +1 и y + 1.

Соответствующий один вкладыш на самом деле не один лайнер больше:

def get_data_locations(): 
    """ Find data locations from the first sheet in document. """ 
    first_sheet = Range('Sheet1', 'A1:Z200').value 
    coordinates = [[x, y] for x, row in enumerate(first_sheet, 1) 
        for y, z in enumerate(row, 1) if z == 'CO'] 
    return coordinates 
0

Моя первая мысль сделать это:

def get_data_locations(): 
    """ Find data locations from the first sheet in document. """ 
    first_sheet = Range('Sheet1', 'A1:Z200').value 
    coordinates = [] 
    for x,row in enumerate(first_sheet): 
     coordinate_pair = [[x+1, y+1] for y,z in enumerate(row) if z == 'CO'] 
     if coordinate_pair: 
      coordinates.append(coordinate_pair) 
     coordinates = [cp for [cp] in coordinates] 
    print(coordinates) 

Но мне кажется, что появляется «CO» только в одной ячейке в каждой строке вашего листа excel. Если это так, то я хотел бы сделать это:

def get_data_locations(): 
    """ Find data locations from the first sheet in document. """ 
    first_sheet = Range('Sheet1', 'A1:Z200').value 
    coordinates = [] 
    for x,row in enumerate(first_sheet): 
     for row y,z in enumerate(row): 
      if z != "CO": continue 
      coordinates.append([x+1, y+1]) 
      break 
    print(coordinates) 

Конечно, всегда есть один вкладыш для вложенных для петель:

def get_data_locations(): 
    """ Find data locations from the first sheet in document. """ 
    first_sheet = Range('Sheet1', 'A1:Z200').value 
    coordinates = [list(itertools.chain.from_iterable([[x+1,y+1] for y,z in enumerate(row) if z=="CO"])) for x,row in enumerate(first_sheet)] 
    print(coordinates) 
0

Вместо

for x in range(len(list_of_some_things)): 
    do_something_with(list_of_some_things[x]) 

используйте диаграмму

for thing in list_of_some_things: 
    do_something(thing) 

Использовать более содержательный имя переменной, чем x, и последний шаблон будет читаться как английский.

 Смежные вопросы

  • Нет связанных вопросов^_^