0

这是我在 Excel 工作表上查找特定值位置的函数。

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)

据我所知,代码按预期工作。然而,出于某种原因,感觉就像我在这里杀死小狗一样。

例如,在这里添加嵌套列表似乎是多余的。

[x + 1, y + 1]

并且需要另一行代码来消除这种愚蠢。

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 建议的价值。对于像我这样的初学者来说,拥有有意义的名字会让世界变得不同。

4

3 回答 3

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.7enumerate()开始采用可选的起始索引。所以你不需要+1inx +1y + 1

相应的 one-liner 不再是真正的 one-liner:

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
于 2015-05-23T05:54:02.047 回答
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)

当然,嵌套的 for 循环总是有一个单行代码:

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)
于 2015-05-23T06:06:18.543 回答
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,后一种模式会读起来像英文。

于 2015-05-23T06:12:36.903 回答