如何使用for range循环在Python中遍历两个列表?

时间:2019-02-06 02:15:49

标签: python list function loops

需要帮助,请使用带有范围和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

3 个答案:

答案 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

仅当函数参数是两个列表时,为了获得所需的输出文本,必须对条件进行硬编码,这不是函数的最佳用法。