我在这个问题上发现的所有回复都是短路的,或者不是纯粹的pythonic。
如果我有几个清单:
audcad = ["audcad",0,0,0,0,0,0,0,0,0,0,0,0,0]
audchf = ["audchf",0,0,0,0,0,0,0,0,0,0,0,0,0]
audjpy = ["audjpy",0,0,0,0,0,0,0,0,0,0,0,0,0]
ccys = ["audcad", "audchf", "audjpy"]
以下代码应阐明我的意图:
for ccy in ccys:
ccy[13] += 10
应该导致:
audcad = ["audcad",0,0,0,0,0,0,0,0,0,0,0,0,10]
audchf = ["audchf",0,0,0,0,0,0,0,0,0,0,0,0,10]
audjpy = ["audjpy",0,0,0,0,0,0,0,0,0,0,0,0,10]
因为我使用字符串对象引用:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
IndexError: string index out of range
我不想使用numpy,因为我要尽可能少地部署到我想要安装的服务器,因此代码需要尽可能的pythonic。如何遍历任意列表以填充和读取每个列表中的特定元素?
我认为像对象列表这样的2D对象可能是更好的解决方案,但我仍然需要如何迭代对象而不必使用大的if语句和单独的数组名称列表(spot hacky SA)。
答案 0 :(得分:4)
您的列表exists()
应该包含其他列表变量本身(作为浅层副本),而不是它们的名称作为字符串
ccys
然后你的代码就可以了。
ccys = [audcad, audchf, audjpy]
答案 1 :(得分:1)
当你这样做时 -
ccys = ["audcad", "audchf", "audjpy"]
您在列表中放置字符串(如"audcad"
),但不会将列表放在ccys
列表中。把列表放在那里你应该做 -
ccys = [audcad, audchf, audjpy]
答案 2 :(得分:1)
如果由于某种原因你实际上必须使用字符串,你可以使用本地语:
.config(function ($stateProvider, $urlRouterProvider, $authProvider) {
$authProvider.facebook({
clientId: '16250xxxxxx',
scope: 'user_friends'
});
$urlRouterProvider.otherwise('/home');
$stateProvider
.state('core', {
abstract: true,
template: '<ui-view>',
resolve: {
'authStatus' : function($auth, $q, User) {
var defer = $q.defer();
$auth.authenticate('facebook').then(function(result) {
User.update(result.data.user);
defer.resolve();
});
return defer.promise;
}
}
})
.state('home', {
parent: 'core',
url: '/home',
templateUrl: 'app/home/home.html'
})
....
.... other states
如果你想通过名字访问,那么你可以使用第一个元素作为名称从列表中创建一个dict:
audcad = ["audcad",0,0,0,0,0,0,0,0,0,0,0,0,0]
audchf = ["audchf",0,0,0,0,0,0,0,0,0,0,0,0,0]
audjpy = ["audjpy",0,0,0,0,0,0,0,0,0,0,0,0,0]
ccys = ["audcad", "audchf", "audjpy"]
for ccy in ccys:
locals()[ccy][13] += 10
答案 3 :(得分:0)
你可以这样做:
for ccy in ccys:
filter(lambda o: o[0] == ccy, locals())[0][13] += 10
它基本上得到第一个元素在ccy
循环的每次迭代中等于当前for
的列表。