【问题标题】:How to compare two key, value pairs embedded in an array?如何比较嵌入在数组中的两个键值对?
【发布时间】:2015-09-30 03:17:38
【问题描述】:

如果我有两个候选人和五个选民,并且投票倾向的结果是:

[
  [:John, :Clinton, -27],
  [:John, :Bush, -8],
  [:Raphael, :Clinton, -12],
  [:Raphael, :Bush, -40],
  [:Damon, :Clinton, 71],
  [:Damon, :Bush, 4],
  [:Elysee, :Clinton, 13], 
  [:Elysee, :Bush, -36],
  [:Griffin, :Clinton, -1],
  [:Griffin, :Bush, 11]
]

我如何查看每个选民,并将最大的 Tendency 数作为对该候选人的投票并将其存储在一个变量中,以便最终统计每位候选人的票数?

你好!非常感谢您的回复。我不仅是编程新手,而且是 Stackoverflow 的新手,如果我没有正确编辑,请见谅。

道歉。

看了你们放的东西,我什至不知道如何处理它们,所以我会放上我想出的代码,并尝试更好地解释我想要实现的目标。忍受我。

如果我有:

def stump_speech
  voter_list = {
    John: "Progressive",
    Raphael: "Conservative",
    Damon: "Libertarian",
    Elysee: "Independent",
    Griffin: "Massachussetts Democrat"
  }
end

并将其与以下内容进行比较:

candidate_list = {}
  candidate_list = {
    Clinton: "Democrat",
    Bush: "Republican",
}

它运行的是什么:

voter_list.each { |voter_name, politics|
candidate_list.each { |candidate_name, party|
  if
    politics == "Progressive" && party == "Republican"
    voting_prob = rand(0..100) - 25
    decision
  elsif
    politics == "Progressive" && party == "Democrat"
    voting_prob = rand(0..100) - 75
    decision
  elsif
    politics == "Conservative" && party == "Republican"
    voting_prob = rand(0..100) - 75
    decision
  elsif
    politics == "Conservative" && party == "Democrat"
    voting_prob = rand(0..100) - 25
    decision
  elsif
    politics == "Independent" && party == "Republican"
    voting_prob = rand(0..100) - 50
    decision
  elsif
    politics == "Independent" && party == "Democrat"
    voting_prob = rand(0..100) - 50
    decision
  elsif
    politics == "Libertarian" && party == "Republican"
    voting_prob = rand(0..100) - 90
    decision
  elsif
    politics == "Libertarian" && party == "Democrat"
    voting_prob = rand(0..100) - 10
    decision
  elsif
    politics == "Massachussetts Democrat" && party == "Republican"
    voting_prob = rand(0..100) - 10
    decision
  elsif
    politics == "Massachussetts Democrat" && party == "Democrat"
    voting_prob = rand(0..100) - 90
    decision
  else
  end
}
}

它输出上面发布的数组,我如何获取数字,例如约翰的,这样它就可以算作给布什的票,拉斐尔给克林顿的票等等,然后把它们扔进一个数组中,我可以在决定获胜者的过程中玩最后的计数吗?

请用你能管理的最简单的方式,好吗?非常感谢!我已经十天了,即使掌握概念也不容易 - 希望不要气馁。

【问题讨论】:

  • 你想要的输出是什么样的?
  • 欢迎使用 Ruby 和 StackOverflow。请稍微澄清一下您的问题。您给了我们一个单独的数组列表,而不是带有键/值对的散列。请edit您的问题并为给定输入添加您想要的输出。此外,如果您尝试过任何事情,最好展示您尝试过的内容,即使它不起作用。这有助于我们了解您遇到的问题。
  • 我冒昧地将输入设为有效的 Ruby 数组,删除对哈希的引用,并稍微清理一下语言。我认为回答者会更清楚您在寻找什么。

标签: arrays ruby


【解决方案1】:

从以下数组数组开始:

tendencies = [
  [:John, :Clinton, -27],
  [:John, :Bush, -8],
  [:Raphael, :Clinton, -12],
  [:Raphael, :Bush, -40],
  [:Damon, :Clinton, 71],
  [:Damon, :Bush, 4],
  [:Elysee, :Clinton, 13], 
  [:Elysee, :Bush, -36],
  [:Griffin, :Clinton, -1],
  [:Griffin, :Bush, 11]
]

首先,我将使用 Enumerable 的 group_by 按投票者组织每个数组中的 first 条目。

tendencies.group_by {|t| t.first}

或者,等价的,

tendencies.group_by(&:first)

这会产生以下哈希:

{
  :John    =>[[:John, :Clinton, -27], [:John, :Bush, -8]],
  :Raphael =>[[:Raphael, :Clinton, -12], [:Raphael, :Bush, -40]]
  :Damon   =>[[:Damon, :Clinton, 71], [:Damon, :Bush, 4]],
  :Elysee  =>[[:Elysee, :Clinton, 13], [:Elysee, :Bush, -36]],
  :Griffin =>[[:Griffin, :Clinton, -1], [:Griffin, :Bush, 11]]
}

现在,我假设您希望每个选民有一名候选人。因此,如果我们查看上面的每个values,就会有两个选项,我们想要一个带有max 的选项。由于我们希望每个值一个候选者,我们可以使用map。例如,为了只获得布什的选票,我们可以这样做:

tendencies.group_by(&:first).values.map(&:last)

这需要上面每一行的最后一个(第二个)子数组:

[
  [:John, :Bush, -8],
  [:Raphael, :Bush, -40],
  [:Damon, :Bush, 4],
  [:Elysee, :Bush, -36],
  [:Griffin, :Bush, 11]
]

但我们不想要这个,不是吗?我们想要具有max Tendency 值的那个。所以我们需要使用max_by。这将根据我们指定的任何标准取最大值,在本例中为每个子数组的 last 值(趋势)。

tendencies.group_by(&:first).values.map{ |v| v.max_by(&:last)}

结果:

[
 [:John, :Bush, -8],
 [:Raphael, :Clinton, -12],
 [:Damon, :Clinton, 71],
 [:Elysee, :Clinton, 13],
 [:Griffin, :Bush, 11]
]

越来越近了!您可以使用另一个map 简单地获取结果的中间值(索引[1]):

tendencies.group_by(&:first).values.map{ |v| v.max_by(&:last)}.map{ |v| v[1]}

结果:[:Bush, :Clinton, :Clinton, :Clinton, :Bush]

现在只取决于您希望如何表示这个最终计数。假设您想要每个候选人的计数。有a few ways 可以做到这一点,但我将使用我们上面使用过的group_bymap

votes = [:Bush, :Clinton, :Clinton, :Clinton, :Bush]

votes.group_by{|v| v}

# => {:Bush=>[:Bush, :Bush], :Clinton=>[:Clinton, :Clinton, :Clinton]}

votes.group_by{|v| v}.map{|candidate, votes| [candidate, votes.count]}

# => [[:Bush, 2], [:Clinton, 3]]

【讨论】:

    【解决方案2】:
    array = 
    [[:John, :Clinton, -27],
    [:John, :Bush, -8],
    [:Raphael, :Clinton, -12],
    [:Raphael, :Bush, -40],
    [:Damon, :Clinton, 71],
    [:Damon, :Bush, 4],
    [:Elysee, :Clinton, 13],
    [:Elysee, :Bush, -36],
    [:Griffin, :Clinton, -1],
    [:Griffin, :Bush, 11]]
    

    看看约翰的做法:

    array.select { |rec| rec[0] == :John } # => [[:John, :Clinton, -27], [:John, :Bush, -8]]
    

    或者获得布什的总票数

    vote_sum = 0
    array.select { |rec| rec[1] == :Bush }.each { |rec| vote_sum += rec[-1] }
    

    注意 sum 在 Rails 中可用,但在普通 Ruby 中不可用(您也可以使用注入)

    【讨论】:

    • 实际上,max 在 Ruby 的 Enumerable 中,因此可以在没有 Rails 的普通 Ruby 中用于数组。
    • 啊,是的。只缺少总和。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 2021-09-19
    • 2015-12-17
    相关资源
    最近更新 更多