Python 使用原始输入的操作

Python 使用原始输入的操作,python,list,python-2.7,dictionary,Python,List,Python 2.7,Dictionary,我有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_输入请求我一个晚上和一个时间,然后它会将值返回给我 night = raw_input('Which night? mon,tue,wed,thu or fri. ') tim

我有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_输入请求我一个晚上和一个时间,然后它会将值返回给我

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]
这里的问题是“夜间”原始输入是一个字符串,不能用于夜间[时间]

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

我该怎么做呢?

你可以将流星事件对应的日期存储为字典,如下所示

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]
)
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]]
同样,你也可以将时间存储为字典

times = dict(
    t11 = 0
    t12 = 1,
    t01 = 2,
    t02 = 3,
    t03 = 4
)
现在,只需从
时间
事件
中获取索引并显示它们,如下所示

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]
)
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]]

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

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],
}
现在,你可以映射到这一点,以获得每晚。您还需要为您的时代准备一本类似的词典:

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]]
您还可以使用指定的时间条目名称:

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),
}
现在,每个条目都具有将名称映射到值的属性<代码>夜间['mon'].t11是
夜间的第一个条目<代码>2

然后,您可以将动态属性访问与一起使用,或使用使访问属性成为可能的字典:

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]
尝试:


字典会使这更容易:
data={'mon':{'t11':2,…},…}
您需要将
时间
字符串映射到
时间
。@MartijnPieters,对不起。修正了:)@MartijnPieters我把你们两个都投了更高的票。。。但我认为这一次不仅提前了2分钟,而且在语法上也更容易让OP适应:)@JonClements别担心,我明白了:)-asdict对我来说也是新的。我认为它不是供公众使用的。@BurhanKhalid不,它是供公众使用的。命名元组的元素不允许以下划线开头,为了避免命名元组的方法与这些元素之间发生冲突,其方法是
\u method
。。。(例如:您可以有一个
asdict
命名元素,并且仍然可以访问
\u asdict
作为方法)。。。