不酷的列表理解
Uncool List Comprehension
这是我在 Excel sheet.
上查找特定值位置的函数
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 建议的价值。拥有有意义的名字对像我这样的初学者来说意义非凡。
在 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()
.
Starting from Python 2.7 enumerate()
采用可选的起始索引。
所以你不需要x +1
和y + 1
中的+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
我的第一个想法是这样做:
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 sheet 每一行的一个单元格中。如果是这样的话,那么我会这样做:
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)
而不是
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
更有意义的变量名,后一种模式读起来像英语。
这是我在 Excel sheet.
上查找特定值位置的函数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 建议的价值。拥有有意义的名字对像我这样的初学者来说意义非凡。
在 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()
.
Starting from Python 2.7 enumerate()
采用可选的起始索引。
所以你不需要x +1
和y + 1
中的+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
我的第一个想法是这样做:
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 sheet 每一行的一个单元格中。如果是这样的话,那么我会这样做:
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)
而不是
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
更有意义的变量名,后一种模式读起来像英语。