0

这些是我的清单

i=["a","b"]
j=["abc","(3)","ab & ac", "(1,4)","xyz"]

我希望我的输出是这样的

j=["abc","a","ab & ac","b","xyz"]

我试过这样,

val=0
for item in j:
    if item.isalpha():
        pass
    else:
        elem=i[val]
        j.replace(item, elem)
        val=val+1

如何将一个列表中的项目插入到另一个不包含字母数字的位置?

4

4 回答 4

1

j 这将保留列表中包含字母的任何列表元素

[s for s in j if any(c in string.letters for c in s)]
于 2013-08-30T03:21:54.777 回答
1

如果您有一个字符或字符串没有出现在任何字符串中,您可以使用 string .join 方法将列表连接成单个字符串,然后使用正则表达式和 re.sub 函数进行替换。之后,您可以使用 .split 方法将字符串重新划分为列表:

>>> import re
>>> i=["a","b"]; j=["abc","(3)","ab & ac", "(1,4)","xyz"]
>>> js = "|".join(j) # merge j into one string
>>> print js
abc|(3)|ab & ac|(1,4)|xyz
>>> print re.sub("\(.*?\)", i[0], js)
abc|a|ab & ac|a|xyz
>>> print re.sub("\(.*?\)", i[0], js, count=1)
abc|a|ab & ac|(1,4)|xyz
>>> for r in i:
        js = re.sub("\(.*?\)", r, js, count=1)


>>> print js
abc|a|ab & ac|b|xyz

最后的 for 循环向您展示了如何做到这一点。括号中的字段将一次一个地从左到右填写。要将其放回列表中:

jnew = js.split("|")

...你就完成了。

于 2013-08-30T03:37:34.870 回答
1

假设“ab & ac”不是字母数字(因为 & 和空格)并且您输入了一个错字,这将解决问题。

def removeNonAlpha(i,j):
    indexI = 0
    indexJ = 0
    while indexJ < len(j):
        if not j[indexJ].isalnum():
            j[indexJ] = i[indexI]
            indexI += 1
        indexJ += 1
    return j

>>>i=["a","b", "c"]
>>>j=["abc","(3)","ab & ac", "(1,4)","xyz"]
>>>removeNonAlpha(i,j)
['abc', 'a', 'b', 'c', 'xyz']

此代码还假设您在 i 中有足够的元素来完全替换 j。

如果由于某些特殊原因您需要允许&符号(这意味着您还需要允许空格),这里是替代方法:

def removeNonAlpha(i,j):
    indexI = 0
    indexJ = 0
    while indexJ < len(j):
        if not j[indexJ].replace('&', '').replace(' ', '').isalnum():
            j[indexJ] = i[indexI]
            indexI += 1
        indexJ += 1
    return j

>>>i=["a","b"]
>>>j=["abc","(3)","ab & ac", "(1,4)","xyz"]
>>>removeNonAlpha(i,j)
['abc', 'a', 'ab & ac', 'b', 'xyz']
于 2013-08-30T04:02:58.293 回答
0

目前尚不清楚您对“字母数字”的定义是什么。正如 DSM 指出的那样,您的示例使用 isalpha,“ab & ac”失败。如果 isalpha 是“字母数字”的可接受定义,并且可以修改数组,那么我提出以下建议:

for index, item in enumerate(j):
    if not item.isalpha():
        j[index] = i.pop(0) if i else None

可能有一个列表理解版本,但它会很混乱。

请注意,根据您的示例输入,上述代码会产生以下结果:

['abc', 'a', 'b', None, 'xyz']

那是因为 i 中实际上没有足够的项目来覆盖 j 的所有非字母数字成员,所以在这种情况下我使用了 None。

于 2013-08-30T04:00:03.233 回答