python - 在 Python、Ruby、Haskell(或其他语言)中迭代列表

标签 python ruby haskell functional-programming

更新:我意识到我提出的问题非常糟糕。这是第二次运行。

考虑以下函数:

myList = []
optimumList = []

def findOptimumListItems():
    n = 5

    for i in range (n + 1):
        for j in range (n + 1 - i):
            myList.append((i, j, n-i-j))

    for i in myList:
        win = 0.0
        draw = 0.0
        for j in myList:
            score = 0
            if (i[0] > j[0]):
                score += 1
            if (i[0] == j[0]):
                score += 0.5
            if (i[1] > j[1]):
                score += 1
            if (i[1] == j[1]):
                score += 0.5
            if (i[2] > j[2]):
                score += 1
            if (i[2] == j[2]):
                score += 0.5  
            if (score == 2):
                win += 1
            if (score == 1.5):
                draw += 1
        if (win/(len(myList)-win-draw) > 1.0):
            optimumList.append(i)

    return optimumList

首先我列一个 list 。对于 n = 5,生成的列表是:

[(0, 0, 5), (0, 1, 4), (0, 2, 3), (0, 3, 2), (0, 4, 1),
 (0, 5, 0), (1, 0, 4), (1, 1, 3), (1, 2, 2), (1, 3, 1),
 (1, 4, 0), (2, 0, 3), (2, 1, 2), (2, 2, 1), (2, 3, 0),
 (3, 0, 2), (3, 1, 1), (3, 2, 0), (4, 0, 1), (4, 1, 0),
 (5, 0, 0)]

然后,该函数获取列表中的每个元素并将其与列表本身进行比较。这就是你的做法:假设我正在比较 [0, 0, 5] 和 [3, 1, 1]。 0 输给 3(所以没有积分),0 输给 1,所以没有积分,5 胜 1(为此得 1 分)。平局得0.5分,赢球得1分。对于任何项目,如果赢多于输,则该项目被认为是最佳的,并被添加到最佳列表中。

对于 n = 5,最佳列表是:

[(0, 2, 3), (0, 3, 2), (1, 1, 3), (1, 2, 2), (1, 3, 1), (2, 0, 3),
 (2, 1, 2), (2, 2, 1), (2, 3, 0), (3, 0, 2), (3, 1, 1), (3, 2, 0)]

我的问题是:如何以简洁的方式编写上述函数?我对函数式算法特别感兴趣。 Python、Ruby、Java、Haskell 的答案将不胜感激。 (话虽如此,如果您有任何语言的简洁解决方案;那没关系。)

很抱歉重复了同样的问题。我同意原来的问题很困惑而且很难理解。我希望现在一切都清楚了。

更新(根据 rampion 的评论):是否有解决此(或此类)问题的有效算法?

最佳答案

第二次更新:太好了——现在我完全明白你想要什么了。这与您最近编辑中的代码的作用相同:

def optimize(myList):
    score_tup = lambda tup_a, tup_b: sum(1.0 if a > b else 0.5 if a == b else 0 for a, b in zip(tup_a, tup_b))
    scores = ((tup_a, [score_tup(tup_a, tup_b) for tup_b in myList]) for tup_a in myList)
    scores = ((tup, score.count(2), score.count(1.5)) for tup, score in scores)
    return [tup for tup, win, draw in scores if (win * 1.0 / (len(myList) - win - draw)) > 1.0]

a = 5
myList = [(i, j, a-i-j) for i in range(a + 1) for j in range(a + 1 - i)]
print myList
print optimize(myList)

如果您想查看此答案的以前版本,请检查编辑;这太长了。

关于python - 在 Python、Ruby、Haskell(或其他语言)中迭代列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5333147/

相关文章:

ruby - 使用链接检查器(ruby)

haskell - 阻止 GHC 警告我一个特定的缺失模式

haskell - Haskell 中的钞票找零机

python - 将 click.command 的结果传递给另一个函数

python - 使用 np.sort 排序但结果不正确

python - 在 Selenium Grid 上运行 Firefox 测试时在 xvfb 显示屏幕之间切换

python - 为什么FastAPI从路由函数返回时会执行两次Pydantic构造函数?

ruby-on-rails - Rails 缓存 - XML 文件?

ruby - Sinatra 中的嵌套布局

list - Haskell 中后缀形式的中缀