【问题标题】:Python list - string formatting as list indicesPython 列表 - 字符串格式化为列表索引
【发布时间】:2016-09-05 11:12:30
【问题描述】:

根据条件,我需要从一个或另一个函数中获取值。我试图把它放在一个简单的If ... Else 语句中。我尝试使用%s 字符串格式,但它不起作用。下面的代码,所以我想做什么会变得更清楚:

if condition:
    item = my_list['%s']
else:
    item = my_other_list['%s']

# now I do something with this value:
print item % 3

如果condition 为真或假,我尝试print 一个或其他列表的第三个值。这返回了一个关于列表索引是字符串的错误。所以我试着把它放在int() 里面没有帮助。

我该怎么做?问题是我得到值 比我声明 item 是什么。

编辑 我将在这里添加更多信息:

我有一个for 循环,它遍历约 1000 个元素并处理它们。如果conditionTrue,它会调用一个或另一个函数(如果为假)。现在,我不想检查相同的条件 1000 次,因为我知道它在这段时间内不会改变,并且想检查一次并将该方法应用于所有元素。

更多代码:

if self.dlg.comboBox_3.currentIndex == 0:
    item = QCustomTableWidgetItem(str(round((sum(values['%s'])/len(values['%s'])),2)))
else:
    item = QCustomTableWidgetItem(str(round(sum(values['%s'],2))))

for row in range(len(groups)):
    group = QTableWidgetItem(str(groups[row]))
    qTable.setItem(row,0,group)            
    qTable.setItem(row,1,item % row)

这是实际代码。不是'%s' 和“% 行”。我之前使用简化不是为了分散实际问题的注意力,但我认为它是必要的。如果这不是一个好的决定,我很抱歉。

【问题讨论】:

  • 列表需要整数索引;第一个元素始终为 0。例如,如果您想访问列表的第三个元素,您可以使用 my_list[2] 执行此操作。因此,除非 %s 是整数,否则您没有正确使用这些列表。跨度>
  • 我不太理解这条评论 - 索引肯定是一个整数(示例中为“3”),但 '%s' 是一个字符串。我希望这个 '%s' 字符串的性质将使索引成为整数,因为稍后将传递 int = 3。
  • 试着让你的代码更明确。您肯定不希望print item %3 影响之前确定的if...else 语句的结果吗?
  • 我仍然不知道%s 来自哪里?它是(应该是)一个列表索引。
  • 好吧,我知道这行不通-我的问题是关于如何以正确的方式影响if。不过可能完全不同。

标签: python list


【解决方案1】:

您对列表切片的工作原理存在相当大的误解。它总是在你调用它的时候发生,所以在你的 if 循环本身中,Python 将尝试通过文字字符串 "%s" 对任何一个列表进行切片,这不可能工作。

没有必要这样做。您可以将 列表 指定为 if 语句的输出,然后直接对其进行切片:

if condition:
    list_to_slice = my_list
else:
    list_to_slice = my_other_list

# now I do something with this value:
print list_to_slice[3]

【讨论】:

  • 谢谢。我在那里发布了一个代码更新,我认为这会让它更清楚。
【解决方案2】:

简答:

'%s' 根据定义是一个字符串,而列表索引根据定义应该是一个整数

如果您确定字符串可以是整数,请使用int(string)(如果不是,它将引发ValueError

【讨论】:

  • 你的意思是item = my_list[int('%s')] 吗?正如我写的那样,我已经尝试过了,它给了ValueError: invalid literal for int() with base 10: '%s'
  • @adamczi 啊,我错过了,%s的来源是什么?
  • '%s' 的来源?我正在尝试找到一种类似于 ''%s' % text_variable' 但适用于列表索引的方法。
【解决方案3】:

列表由索引引用的多个数据值组成。 所以如果我这样定义我的列表:

my_list = [apples, orange, peaches]

如果我想引用列表中的某些内容,我会这样做

print(my_list[0]) 

这行代码的预期输出是“apples”。 要真正向列表添加新内容,您需要使用列表对象的内置方法,如下所示:

my_list.append("foo")

然后新列表将如下所示

[apples, orange, peaches, foo]

我希望这会有所帮助。

【讨论】:

  • 非常感谢您的努力,但您的回答与问题不太相关。
  • 我只想提一下这段代码是针对 Python 3 的。所以请记住这一点,因为 OP 使用了print something 表示使用的是 Python 2。
  • @albert print "string"python3 中不起作用,但print("string")python2 中工作正常
  • 没错,但在语义上与此处讨论的不同:stackoverflow.com/a/12162754/3991125
【解决方案4】:

我建议使用这样的函数:

def get_item(index, list1, list2)
    if condition:
        return list1[index]
    else:
        return list2[index]

print get_item(3)

【讨论】:

  • 谢谢,但在我的情况下,这将与元素一样多次执行,所以这不是我想要的。我在那里发布了代码更新。
【解决方案5】:

这是一种简洁的方法:

source = my_list if condition else my_other_list
print(source[2])

这会将变量source 绑定到my_listmy_other_list,具体取决于条件。然后使用整数索引访问所选列表的第三个元素。此方法的优点是,如果您需要访问列表中的其他元素,source 仍然绑定到列表。

另一种方式,和你的类似,是直接获取元素:

index = 2
if condition:
    item = my_list[index]
else:
    item = my_other_list[index]
print(item)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 2015-05-04
    相关资源
    最近更新 更多