需要帮助,请使用带有范围和len的for循环。两个问题。
说我有一个由“ W”或“ L”组成的列表,这意味着一场比赛获胜或一场比赛输了,而第二个列表则用整数表示得分点(并且位置对应于同一场比赛),那么我怎么能编写一个函数(不使用zip函数)来告诉用户例如“我们赢了多少场比赛并准确得分3分”? 而“我们至少赢得9分赢了多少场比赛?”
首先,我尝试合并两个列表和位置,即位置0的值类似于L4。然后,我可以搜索特定条件,但是当搜索大于或小于特定数字的点(至少赢得x点)时,这变得很棘手。
现在,我正在考虑遍历像i in这样的一个循环,使i在range(x))和len中。但是我很困惑这将如何与两个列表一起使用,并且我仍然非常不熟悉编码和语法。
感谢您的投入和时间
def score_check(lst1, lst2):
for 'W' in range(lst1[i] if 3 in lst2[i]):
.........
.....
return result
def main():
record = ['L', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'L', 'W', 'W']
points = [4, 1, 3, 2, 7, 4, 3, 10, 8, 14, 7, 6, 7]
check = score_check(record, points)
print(check)
main()
预期结果:
2 wins with 3 points scored and
2 wins with at least 9 points scored
答案 0 :(得分:1)
因此,我认为最好的选择是使用zip
。但是,由于您不想使用它,可以这样做:
def score_check(lst1, lst2):
lst_size_1 = len(lst1)
lst_size_2 = len(lst2)
if (lst_size_1 !=lst_size_2):
return
for i in range(lst_size):
print (lst1[i])
print (lst2[i])
祝你好运!
答案 1 :(得分:0)
如果不能使用zip
,则可以只使用元素的索引。
record = ['L', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'L', 'W', 'W']
points = [4, 1, 3, 2, 7, 4, 3, 10, 8, 14, 7, 6, 7]
combined = [{'points': points[i], 'result': record[i]} for i in range(len(record))]
# this way is cleaner
#combined = [{'points': p, 'result': r} for r, p in zip(record, points)]
现在combined
是一个字典列表,其中包含record
的键/值对和原始列表中的点entries
。它假定两个列表的长度相同,但这似乎是一个合理的假设,否则您的数据不是真正有效的。 zip
将在两个列表中的较短列表耗尽时停止运行,从而实现无缝处理。如果该代码试图访问两个列表中都不存在的索引,则会抛出该代码。
如果您现在要查询此列表,则只需使用filter
内置函数并将其传递给谓词即可确定结果中有无。
示例
print('matches where score was greater than 3')
for result in filter(lambda r: r['points'] > 3, combined):
print(result)
这包括点值大于3的所有条目。您可以轻松地将其设置为<
(小于),>=
(大于或等于)或==
(等于)您想要的任何数字。
您还可以将result参数组合到过滤的对象上
print('matches where score was less than 5 but won')
for result in filter(lambda r: r['points'] < 5 and r['result'] == 'W', combined):
print(result)
注意:滤波器函数始终是线性的(O(n))。它们始终遍历所有条目。因此,对于较大的结果集,其效率较低且较慢。一种调整方法是按分数对列表进行排序,并使用二进制搜索(在python bisect
模块中)来缩小搜索范围。仅当您基于得分进行搜索时,这才有影响。如果要搜索W / L结果,则返回线性。
答案 2 :(得分:0)
因此不允许使用zip。列表理解呢?
def score_check(results, points):
wins = [points[i] for i, v in enumerate(results) if v == 'W']
exactly_three = len([win for win in wins if win == 3])
at_least_nine = len([win for win in wins if win >= 9])
return (f'{exactly_three} wins with 3 points scored',
f'{at_least_nine} wins with at least 9 points scored')
record = ['L', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'L', 'W', 'W']
points = [4, 1, 3, 2, 7, 4, 3, 10, 8, 14, 7, 6, 7]
print(*score_check(record, points), sep='\n')
2 wins with 3 points scored
2 wins with at least 9 points scored
仅当函数参数是两个列表时,为了获得所需的输出文本,必须对条件进行硬编码,这不是函数的最佳用法。