如何在Python

时间:2015-08-11 11:51:29

标签: python list

我在这个问题上发现的所有回复都是短路的,或者不是纯粹的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)。

4 个答案:

答案 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的列表。