我有
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
如果我传递了许多行,或只传了一行。
我该怎么做?
答案 0 :(得分:3)
为什么不喜欢使用:
foo=(("bob","smith","123"),)
然后
for row in foo:
DoSomething(row[0])
答案 1 :(得分:2)
我经常在接受不同类型输入的函数中使用的技巧是首先将不常见的输入规范化为公共类型,然后处理公共类型。同样,在您的情况下,您可以执行类似(未经测试)的操作:
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
答案 2 :(得分:0)
您肯定需要额外检查,因为字符串也是可迭代的。那你为什么不在列表中使用特定的格式呢?
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])
答案 3 :(得分:0)
在if
中使用for
表达式。
for rows in (foo,) if type(foo[0]) is not tuple else foo:
print(rows)