【问题标题】:Manipulations with raw_input使用 raw_input 进行操作
【发布时间】:2014-07-19 13:14:48
【问题描述】:

我有 5 个包含 5 个整数的列表。

它们是数小时内观测到的流星数量。

# Nights = [11pm,12pm,1am,2am,3am]
mon = [2,4,1,3,2]
tue = [3,2,4,3,3]
wed = [1,2,1,1,1]
thu = [4,3,2,3,4]
fri = [2,1,2,1,1]

我想用 raw_input 询问我一个晚上和一个时间,然后它将值返回给我。

night = raw_input('Which night? mon,tue,wed,thu or fri. ')
time = raw_input('Which time? t11,t12,t01,t02 or t03. ')
t11,t12,t01,t02,t03 = 0,1,2,3,4
print night[time]

这里的问题是'night' raw_input 是一个字符串,不能用于 night[time]

TypeError: cannot concatenate 'str' and 'float' objects

我该怎么做?

【问题讨论】:

  • 字典会让这更容易:data = {'mon': {'t11': 2, ...}, ...}

标签: python list python-2.7 dictionary


【解决方案1】:

您可以将对应天数的流星事件存储为字典,像这样

occurrences = dict(
    mon = [2, 4, 1, 3, 2],
    tue = [3, 2, 4, 3, 3],
    wed = [1, 2, 1, 1, 1],
    thu = [4, 3, 2, 3, 4],
    fri = [2, 1, 2, 1, 1]
)

您也可以将时间存储为字典

times = dict(
    t11 = 0
    t12 = 1,
    t01 = 2,
    t02 = 3,
    t03 = 4
)

现在,只需从 times 获取索引并从 occurrences 获取出现次数并显示它们,就像这样

night = raw_input('Which night? mon,tue,wed,thu or fri. ')
time = raw_input('Which time? t11,t12,t01,t02 or t03. ')
print occurrences[night][times[time]]

【讨论】:

  • 您还需要将time 字符串映射到times
  • @MartijnPieters 哎呀,对不起。修复了:)
  • @MartijnPieters 我对你们俩都投了赞成票……但我认为这不仅提前了 2 分钟,而且语法更容易让 OP 适应 :)
  • @JonClements 别担心,我明白了 :) - _asdict 对我来说也是新的。我认为它不适合公众使用。
  • @BurhanKhalid 不,它意味着供公众使用。命名元组的元素不允许以下划线开头,为了避免命名元组的方法与那些元素发生冲突,它的方法是_method...(例如:你可以有一个asdict 命名元素,并且仍然访问_asdict作为方法)...
【解决方案2】:

night 只是一个字符串,而不是同名变量。将这些列表放入字典中:

nights = {
    'mon': [2,4,1,3,2],
    'tue': [3,2,4,3,3],
    'wed': [1,2,1,1,1],
    'thu': [4,3,2,3,4],
    'fri': [2,1,2,1,1],
}

现在您可以映射到 that 以获取每晚。您还需要一本适合您时代的类似字典:

times = {'t11': 0, 't12': 1, 't01': 2, 't02': 3, 't03': 4}

现在您可以使用这些映射映射到nights 结构:

night = raw_input('Which night? mon,tue,wed,thu or fri. ')
time = raw_input('Which time? t11,t12,t01,t02 or t03. ')
print nights[night][times[time]]

您还可以使用collections.namedtuple() object 为您的时间条目命名:

from collections import namedtuple

NightEntry = namedtuple('NightEntry', 't11 t12 t01 t02 t03')

nights = {
    'mon': NightEntry(2,4,1,3,2),
    'tue': NightEntry(3,2,4,3,3),
    'wed': NightEntry(1,2,1,1,1),
    'thu': NightEntry(4,3,2,3,4),
    'fri': NightEntry(2,1,2,1,1),
}

现在每个条目都有将名称映射到值的属性; nights['mon'].t11'mon' 晚上的第一个条目; 2.

然后您可以通过getattr() 使用动态属性访问,或使用namedtuple._asdict() method 使访问属性成为可能:

night = raw_input('Which night? mon,tue,wed,thu or fri. ')
time = raw_input('Which time? t11,t12,t01,t02 or t03. ')

# using getattr
print getattr(nights[night], time)

# using a dictionary
print nights[night]._asdict()[time]

【讨论】:

    【解决方案3】:
    times = ['t11','t12','t01','t02','t03']
    vars()[night][times.index(time)]
    

    我们首先通过字符串名称查找正确的变量,然后将时间名称映射到列表索引。

    【讨论】:

      【解决方案4】:

      试试:

      # Nights = [11pm,12pm,1am,2am,3am]
      meteors = [[2,4,1,3,2],[3,2,4,3,3],[1,2,1,1,1],[4,3,2,3,4],[2,1,2,1,1]]
      
      night = raw_input('Which night? mon,tue,wed,thu or fri. ')
      time = raw_input('Which time? t11,t12,t01,t02 or t03. ')
      night_string = ['mon', 'tue', 'wed', 'thu', 'fri']
      time_string =['t11','t12','t01','t02','t03']
      print meteors[night_string.index(night)][time_string.index(time)]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-19
        • 2012-10-27
        相关资源
        最近更新 更多