遍历列表并替换某个索引中的实例?

时间:2019-02-23 11:00:44

标签: python

出于这个问题的目的,我有一个名为List的列表,其中包含元组。

List = [
    ("foo", "bar", 1, 0),
    ("foo", "bar", 3, 1),
    ("foo", "bar", 1, 2)
]

在每个子列表的索引位置2(列表中的第三项)中,我需要替换为另一个列表中的相应项。

References = ["zero", "one", "two", "three"]

预期输出将是以下项的新List

List = [
    ("foo", "bar", "one", 0),
    ("foo", "bar", "three", 1),
    ("foo", "bar", "one", 2)
]

请注意,列表的其他部分还存在整数,但这些整数保持不变。

我当前的代码替换了所有个整数实例,这些实例不是我想要的:

for r in range(0, len(References)):
    for i in List:
        List[List.index(i)] = [References[t] if x==t else x for x in i]

问:我该怎么做?预先感谢。

编辑:我在代码中犯了一个错误-List中是元组,而不是列表。

4 个答案:

答案 0 :(得分:3)

您是要这样做吗?

for el in List: el[2] = References[el[2]]

答案 1 :(得分:1)

请使用下面的代码段,

List = [
    ["foo", "bar", 1, 0],
    ["foo", "bar", 3, 1],
    ["foo", "bar", 1, 2]
]

References = ["zero", "one", "two", "three"]

for each in List:
    if list(each):
        each[2]=References[each[2]]
print(List)

注意:参考列表的位置被认为是等效字符串。

答案 2 :(得分:1)

组是不可变的,这意味着您无法更新或更改元组元素的值。您可以按照以下任一过程进行操作:

1),您可以采用部分现有元组来创建新元组,如下所示:

List_One = [
    ("foo", "bar", 1, 0),
    ("foo", "bar", 3, 1),
    ("foo", "bar", 1, 2)
]

List_Two = []

References = ["zero", "one", "two", "three"]

for i in List_One:
    tup = (i[0], i[1], References[i[2]], i[3])
    List_Two.append(tup)

print(List_Two)

2)您可以将元组转换为列表,根据需要进行更改,然后将列表更改回元组。

List = [
    ("foo", "bar", 1, 0),
    ("foo", "bar", 3, 1),
    ("foo", "bar", 1, 2)
]

References = ["zero", "one", "two", "three"]

for i in range(len(List)):
    List[i] = list(List[i])

for i in List:
    i[2] = References[i[2]]

for i in range(len(List)):
    List[i] = tuple(List[i])

print(List)

答案 3 :(得分:1)

首先,避免对变量名进行大写(对于命名约定,请遵循PEP8)。

第二,您可以使用列表理解:

>>> L = [
...     ["foo", "bar", 1, 0],
...     ["foo", "bar", 3, 1],
...     ["foo", "bar", 1, 2]
... ]
>>> references = ["zero", "one", "two", "three"]
>>> [row[:2]+[references[row[2]]]+row[3:] for row in L]
[['foo', 'bar', 'one', 0], ['foo', 'bar', 'three', 1], ['foo', 'bar', 'one', 2]]

原始列表不会被修改,但是会生成一个新列表。 (仅当您有列表,而没有元组时才起作用。)

第三,我想onetwo,...只是一个例子。如果您确实希望以纯文本形式显示数字,而不是对references列表进行硬编码,则可以使用某些库来进行数字到单词的转换,例如num2words

四,您正在执行相当于SQL JOIN的功能。如果引用不正确,当前代码将失败(引发KeyError):

  • 对于INNER JOIN,只需检查row[2] in references是否存在,如果不是,请跳过该行。
  • 对于LEFT JOIN,用references[row[2]]的{​​{1}}替换references.get(row[2])