无论我有 1 行还是 N 行,都使用行列表

Using list of rows whether I have 1 row or N many

我有

foo=("bob","smith","123")

有时

foo=(("bob","smith","123"),("sam","smith","124"))

和一个for循环:

for rows in foo:

但我希望 for 循环将 foo 视为行列表,即使它只是其中的一行而不是 n 行。现在,如果我只在第一个 foo 中通过,它将按 bob、smith、123 进行迭代,但如果我通过第二个 foo,它将按行进行迭代(这是我想要的)。对象是 pyodbc.Row.

另一种说法是我希望能够使用:

foo[0][1]=stuff

如果我传递了很多行,或者只有一行。

我该怎么做?

你肯定需要额外检查,因为字符串也是可迭代的。那你为什么不为你的列表使用特定的格式呢?

foo=(("bob",),("smith",),("123",))

你也可以检查类型来获取元素。或者如果你坚持:

# foo = ("bob", "smith", "123")
foo=(("bob","smith","123"),("sam","smith","124"))
for rows in foo:
    a = rows if isinstance(rows, tuple) else (rows,)
    print (a[0])

您为什么不喜欢使用:

foo=(("bob","smith","123"),)

然后

for row in foo:
    DoSomething(row[0])

我在接受不同类型输入的函数中经常使用的一个技巧是首先将不常见的输入规范化为常见类型,然后再处理常见类型。同样,在您的情况下,您可以执行类似 (untested):

if not isinstance(foo[0], tuple):  # only a single row
    foo = (foo,)  # add row to tuple of lenght 1 
for row in foo:  # now we are sure foo is a tuple of rows
    # do something with row

for中使用if表达式。

for rows in (foo,) if type(foo[0]) is not tuple else foo:
    print(rows)