【问题标题】:Python list operationPython列表操作
【发布时间】:2013-05-09 11:40:05
【问题描述】:

我有两个列表 ListA ListB 如下:

ListA=['1','1','2','2','2','3','4','4','5','5','5','5']
ListB=['1','5']

我正在尝试提出与 List A 长度相同的 List C,但将 List A 中的数字替换为'X' 如果数字在 List B 中。我期待的结果:

ListC=['X','X','2','2','2','3','4','4','X','X','X','X']

仅供参考,ListB 的长度将始终小于 ListA 的长度,并且 ListB 将不包含任何不在 列表 A.

我试过这样:

ListA=['1','1','2','2','2','3','4','4','5','5','5','5']
ListB=['1','5']
ListC=[]
for items in ListB:
    for a in ListA:
        if items==a:
            ListC.append('X')
        else:
            ListC.append(a)

显然这将创建一个具有 (listB X 长度 A) 的列表,而不仅仅是列表 A 的长度。是否有任何内置函数可以执行此操作?谁能告诉我怎么做?

【问题讨论】:

  • 我认为您最好使用替换字典,例如{1=>X, 5=>O},然后简单地使用newList=[dct.get(x,x) for x in oldList]

标签: python list operation


【解决方案1】:

任何时候您在同一个list 上反复进行成员资格测试时,最好创建一个set。虽然构建 set 需要一些时间,但单独的查找速度会快得多

SetB = set(ListB)
[i if i not in SetB else 'X' for i in ListA]

【讨论】:

  • 哦,太聪明了! Python 不是在我们不知道的情况下以某种方式在内部执行它吗?我知道 Python 有时会这样做。
  • Suite:因为我知道 Python 在内部确实将 a in [1,2,3] 更改为 a in frozenset([1,2,3]),但也许它每次检查时都会在内部进行更改,因此按照您的意图手动进行可能更聪明。
  • @JeromeJ 不,它没有,你在哪里看到的?检查dis.dis(lambda: a in [1, 2, 3]) 它优化为一个元组,仅此而已。是的,您确实需要手动执行...您可能正在考虑这个:dis.dis(lambda: a in {1, 2, 3}) on Py 3
  • @gnibbler 用frozenset 代替set 怎么样? set 不需要更改,为什么不呢?
  • @JeromeJ,我不明白为什么,因为我们不需要它是可散列的。为什么你认为它更好?
【解决方案2】:

List Comprehension 是你的朋友:

ListA=['1','1','2','2','2','3','4','4','5','5','5','5']
ListB=['1','5']
ListC = [i if i not in ListB else 'x' for i in ListA]

--> ['x', 'x', '2', '2', '2', '3', '4', '4', 'x', 'x', 'x', 'x']

希望这会有所帮助!

【讨论】:

    【解决方案3】:

    您可以使用列表推导:

    [i if i not in ListB else 'X' for i in ListA]
    

    要修复您当前的代码,请使用in 检查项目是否在ListB 中:

    for item in ListA:
        if item in ListB:
            ListC.append('X')
        else:
            ListC.append(item)
    

    【讨论】:

    • 不想让人讨厌。假设我们还有 1 个列表,ListD=['O','X'] 与 ListB 的长度相同。假设问题上的所有条件仍然适用,但是我们可以用列表 C 中的项目替换列表 A 中的匹配项,而不是替换为匹配项的“X”吗?这意味着我们仍在比较列表 A 和 B,但如果 B 的第一项在 A 中,则将 A 的匹配项替换为 C 的第一项。示例( ListD=['O','O','2', '2','2','3','4','4','X','X','X','X'])
    • nvm 我设法通过使用“索引”让它工作,非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 2017-02-08
    • 2019-09-24
    • 2019-03-14
    相关资源
    最近更新 更多