在 Python 中将多个变量结果合并到一个列表中
Combine multiple variable results into a single list in Python
我有一个名为 records 的列表,其中包含 records[1] 中的 mw 值。然后我用四个 if
语句测试这些 mw 值,我根据 mw 的值更改输出结果,如下所示。
mw = records[1]
if mw <= 100:
output1 =(records[1],"valueA", records[4], "moreItems")
if 100< mw <= 300:
output2 =("records[1]","valueB", records[4], "moreItems")
if 300< mw <= 600:
output3 =("records[1]","valueC", records[4], "moreItems")
if mw > 600:
output4 =("records[1]","valueD", records[4] , "moreItems")
if
语句背后的主要思想是我需要根据 mw 值更改一些列表值。这意味着 output1 变量将与 output2 略有不同。
如何组合这四个输出?理想情况下,我想要输出 1 的所有结果,然后是 2,然后是 3,如下所示。
98.7,valueA,False,moreItems #from output1
50,valueA,False,moreItems #from output1
210,valueB,True,moreItems #From output2
400,valueC,True,moreItems #From output3
498,valueC,True,moreItems #From output3
580,valueC,True,moreItems #From output3
800,valueD,False,moreItems #From output4
由于您希望按顺序输出,我认为在一个循环中完成此操作并不容易——最好有四个单独的循环。这可能是 list comprehensions 的好地方。我们可以生成四个列表,每个输出格式一个,然后将它们粘合在一起,return 组合列表。假设您有一个正在读取的记录列表:
#records_list is a list of records defined somewhere above
output1_list = [(records[1],"valueA", records[4], "moreItems") for records in records_list if records[1] <= 100]
output2_list = [(records[1],"valueB", records[4], "moreItems") for records in records_list if 100 < records[1] <= 300]
output3_list = [(records[1],"valueC", records[4], "moreItems") for records in records_list if 300 < records[1] <= 600]
output4_list = [(records[1],"valueD", records[4], "moreItems") for records in records_list if 600 < records[1]]
final_output = output1_list + output2_list + output3_list + output4_list
# Later on, print all the results
for output in final_output:
print output
我不明白你是如何只用 4 个变量得到所有输出的。或者换句话说,使用大量编号 "sibling" 的变量只会让您头疼 --- 您需要一个可以反复调用的函数。类似于:
def process_record(record):
mw = record[1]
if mw <= 100:
output = (record[1], "valueA", record[4], "moreItems")
elif 100 < mw <= 300:
output = (record[1], "valueB", record[4], "moreItems")
elif 300 < mw <= 600:
output = (record[1], "valueC", record[4], "moreItems")
elif 600 < mw:
output = (record[1], "valueD", record[4], "moreItems")
else:
raise ValueError("Illegal record: %s" % repr(record))
return output
此 return 与您分配给 output1
、output2
等的元组相同,但可以使用任意多次。 (请注意,由于它一次只对一条记录进行操作,因此我将其名称和参数更改为单数 "record"。并且我将单独的 if
语句更改为一系列 elif
语句使用默认大小写。)
您的输出元组以数字开头...在 Python 中,元组自动按第一个元素排序,然后按第二个元素排序,依此类推。因此您可以 使用内置sorted
函数 产生你想要的输出:
def main():
records = [
# You know how you're acquiring these records; I don't.
]
processed_records = [process_record(record) for record in records]
for record in sorted(processed_records):
print(",".join(str(dat) for dat in record))
return
如果在您的实际代码中,您没有偶然地将数字放在元组的开头,或者如果您的值类别字符串("valueA"
等等)没有碰巧排序按字母顺序排列成与数字相同的顺序,您仍然可以使用 sorted
,但您必须为其提供一个关键函数来生成您想要的排序。
键函数 自动应用于要排序的列表的每个元素,将其转换为更易于排序的内容,通常是整数或字符串等简单内容。如果您不关心数字顺序,您可以只 return "valueA"
或任何字符串。我下面的示例按该字符串排序,然后是数字,然后是其他所有内容,因为我无法判断这些其他字段是否重要。
def processed_record_key(record):
int_val, value_category, unknown_boolean, unknown_string = record
return value_category, int_val, unknown_boolean, unknown_string
现在,您只需使用它:
for record in sorted(processed_records, key=processed_record_key):
# Same as before...
查看 Sorted HowTo 了解更多排序技巧。
最后,我建议您考虑为您的数据记录使用 namedtuple --- 它会使您的元组(以及使用它们的代码)更具自我描述性并且更易于使用。
我有一个名为 records 的列表,其中包含 records[1] 中的 mw 值。然后我用四个 if
语句测试这些 mw 值,我根据 mw 的值更改输出结果,如下所示。
mw = records[1]
if mw <= 100:
output1 =(records[1],"valueA", records[4], "moreItems")
if 100< mw <= 300:
output2 =("records[1]","valueB", records[4], "moreItems")
if 300< mw <= 600:
output3 =("records[1]","valueC", records[4], "moreItems")
if mw > 600:
output4 =("records[1]","valueD", records[4] , "moreItems")
if
语句背后的主要思想是我需要根据 mw 值更改一些列表值。这意味着 output1 变量将与 output2 略有不同。
如何组合这四个输出?理想情况下,我想要输出 1 的所有结果,然后是 2,然后是 3,如下所示。
98.7,valueA,False,moreItems #from output1
50,valueA,False,moreItems #from output1
210,valueB,True,moreItems #From output2
400,valueC,True,moreItems #From output3
498,valueC,True,moreItems #From output3
580,valueC,True,moreItems #From output3
800,valueD,False,moreItems #From output4
由于您希望按顺序输出,我认为在一个循环中完成此操作并不容易——最好有四个单独的循环。这可能是 list comprehensions 的好地方。我们可以生成四个列表,每个输出格式一个,然后将它们粘合在一起,return 组合列表。假设您有一个正在读取的记录列表:
#records_list is a list of records defined somewhere above
output1_list = [(records[1],"valueA", records[4], "moreItems") for records in records_list if records[1] <= 100]
output2_list = [(records[1],"valueB", records[4], "moreItems") for records in records_list if 100 < records[1] <= 300]
output3_list = [(records[1],"valueC", records[4], "moreItems") for records in records_list if 300 < records[1] <= 600]
output4_list = [(records[1],"valueD", records[4], "moreItems") for records in records_list if 600 < records[1]]
final_output = output1_list + output2_list + output3_list + output4_list
# Later on, print all the results
for output in final_output:
print output
我不明白你是如何只用 4 个变量得到所有输出的。或者换句话说,使用大量编号 "sibling" 的变量只会让您头疼 --- 您需要一个可以反复调用的函数。类似于:
def process_record(record):
mw = record[1]
if mw <= 100:
output = (record[1], "valueA", record[4], "moreItems")
elif 100 < mw <= 300:
output = (record[1], "valueB", record[4], "moreItems")
elif 300 < mw <= 600:
output = (record[1], "valueC", record[4], "moreItems")
elif 600 < mw:
output = (record[1], "valueD", record[4], "moreItems")
else:
raise ValueError("Illegal record: %s" % repr(record))
return output
此 return 与您分配给 output1
、output2
等的元组相同,但可以使用任意多次。 (请注意,由于它一次只对一条记录进行操作,因此我将其名称和参数更改为单数 "record"。并且我将单独的 if
语句更改为一系列 elif
语句使用默认大小写。)
您的输出元组以数字开头...在 Python 中,元组自动按第一个元素排序,然后按第二个元素排序,依此类推。因此您可以 使用内置sorted
函数 产生你想要的输出:
def main():
records = [
# You know how you're acquiring these records; I don't.
]
processed_records = [process_record(record) for record in records]
for record in sorted(processed_records):
print(",".join(str(dat) for dat in record))
return
如果在您的实际代码中,您没有偶然地将数字放在元组的开头,或者如果您的值类别字符串("valueA"
等等)没有碰巧排序按字母顺序排列成与数字相同的顺序,您仍然可以使用 sorted
,但您必须为其提供一个关键函数来生成您想要的排序。
键函数 自动应用于要排序的列表的每个元素,将其转换为更易于排序的内容,通常是整数或字符串等简单内容。如果您不关心数字顺序,您可以只 return "valueA"
或任何字符串。我下面的示例按该字符串排序,然后是数字,然后是其他所有内容,因为我无法判断这些其他字段是否重要。
def processed_record_key(record):
int_val, value_category, unknown_boolean, unknown_string = record
return value_category, int_val, unknown_boolean, unknown_string
现在,您只需使用它:
for record in sorted(processed_records, key=processed_record_key):
# Same as before...
查看 Sorted HowTo 了解更多排序技巧。
最后,我建议您考虑为您的数据记录使用 namedtuple --- 它会使您的元组(以及使用它们的代码)更具自我描述性并且更易于使用。