0

好的,所以我有一个包含三个值的元组列表(code, value, unit)

当我要使用它时,我需要检查一个值是一个 str、一个列表还是一个矩阵。(或检查是否列表,然后再次检查是否列表)

我的问题只是我应该这样做,还是有更好的方法?

for code, value, unit in tuples:
    if isinstance(value, str): 
        # Do for this item
    elif isinstance(value, collections.Iterable):
        # Do for each item
        for x in value:
             if isinstance(x, str):
                  # Do for this item
             elif isinstance(x, collections.Iterable):
                  # Do for each item
                  for x in value:
                      # ...
             else:
                  raise Exception
    else:
        raise Exception
4

5 回答 5

3

最好的解决方案是避免混合这样的类型,但如果你坚持使用它,那么你写的很好,除非我只检查str实例。如果它不是字符串或可迭代的,那么无论如何你都会得到一个更合适的异常,所以不需要自己做。

for (code,value,unit) in tuples:
    if isinstance(value,str): 
        #Do for this item
    else:
        #Do for each item
        for x in value:
             if isinstance(value,str):
                  #Do for this item
             else:
                  #Do for each item
                  for x in value:
于 2012-07-23T12:28:48.003 回答
2

这行得通,但每次你打电话时isinstance,你应该问自己“我可以添加一个方法value吗?” 这会将代码更改为:

for (code,value,unit) in tuples:
    value.doSomething(code, unit)

为此,您必须将类型str和列表包装在实现的辅助类型中doSomething()

于 2012-07-23T12:28:00.243 回答
2

您的方法的替代方法是将此代码分解为更通用的生成器函数(假设 Python 2.x):

def flatten(x):
    if isinstance(x, basestring):
        yield x
    else:
        for y in x:
            for z in flatten(y):
                yield y

(这也包含了邓肯的回答中建议和解释的简化。)

现在,您的代码变得非常简单易读:

for code, value, unit in tuples:
    for v in flatten(value):
        # whatever

将代码分解出也有助于在代码中的多个位置处理这种数据结构。

于 2012-07-23T12:33:31.523 回答
1

只需使用元组并捕获任何异常。跳之前不要看:)

于 2012-07-23T12:28:05.827 回答
0

递归会有所帮助。

def processvalue(value):
  if isinstance(value, list): # string is type Iterable (thanks @sven)
    for x in value:
      processvalue(value)
  else:
    # Do your processing of string or matrices or whatever.


# Test each the value in each tuple.
for (code, value, unit) in tuples:
  processvalue(value)

这是处理嵌套结构的一种更简洁的方法,并且还将使您能够处理任意深度。

于 2012-07-23T12:36:25.970 回答