【问题标题】:Update specific items within a list更新列表中的特定项目
【发布时间】:2016-11-03 17:52:06
【问题描述】:

我有以下输入:

'lesson*lesson*practice*lesson*quiz*practice'

这是所需的输出:

'lesson1*lesson2*practice1*lesson3*quiz*practice2'

因此,如果列表中有任何项目重复,我想将 1,2,3... 附加到出现的位置。为此,我想出了以下代码:

line = 'lesson*lesson*practice*lesson*quiz*practice'
line1 = line

def list_to_dict(li):  
    dct = {}  
    for item in li.split('*'):  
        if dct.has_key(item):  
            dct[item] = dct[item] + 1  
        else:  
            dct[item] = 1  
    return dct

for item in list_to_dict(line).keys():
    counter = 1
    if list_to_dict(line)[item] > 1:
        indices = [i for i, x in enumerate(line.split('*')) if x == item]
        for idx, _ in enumerate(line1[indices]):
            line1[idx] = line1[idx] + str(counter)
            counter = counter + 1

print line1
print line

但是这段代码给了我以下错误:

TypeError                                 Traceback (most recent call last)
<ipython-input-187-a85290a89eea> in <module>()
      6     if list_to_dict(line)[item] > 1:
      7         indices = [i for i, x in enumerate(line) if x == item]
----> 8         for idx, _ in enumerate(line1[indices]):
      9             line1[idx] = line1[idx] + str(counter)
     10             counter = counter + 1

TypeError: string indices must be integers, not list

有人可以帮助获得所需的输出吗?

如果您认为我的算法不能很好地实现这一点,我也欢迎任何新想法。

【问题讨论】:

  • for idx, _ in enumerate(line1[indices]): 应该做什么?
  • 不应该只是for idx in indices:
  • @LutzHorn:我从stackoverflow.com/questions/3173915/… 获取了您正在讨论的特定代码。这是为了替换列表中的项目。
  • @PatrickHaugh:我试过你之前说的,我收到以下错误:TypeError Traceback (most recent call last) &lt;ipython-input-200-a67f65e082c3&gt; in &lt;module&gt;() 7 indices = [i for i, x in enumerate(line.split('*')) if x == item] 8 for idx in indices: ----&gt; 9 line1[idx] = line1[idx] + str(counter) 10 counter = counter + 1 11 TypeError: 'str' object does not support item assignment
  • 所以你复制了你不理解的代码并要求我们给你解释一下?

标签: python list


【解决方案1】:

我没有尝试您的代码,但我怀疑使用 dict 会导致排序问题?这是一个解决方案:

from collections import Counter

def add_counts_to_words(s):
    words = s.split('*')
    totals = Counter(words)
    counts = Counter()
    result = []
    for word in words:
        if totals[word] > 1:
            counts.update([word])
            result.append('%s%d' % (word, counts[word]))
        else: # singleton
            result.append(word)
    return '*'.join(result)

print add_counts_to_words('lesson*lesson*practice*lesson*quiz*practice')

【讨论】:

  • 做到了。非常感谢您的回答。
【解决方案2】:

不知道你为什么要重新发明collections.Counter

但你的答案过于复杂

from collections import Counter

line = 'lesson*lesson*practice*lesson*quiz*practice'
line_list = line.split('*')

counter = Counter()
output_list = []
for elem in line_list:
    counter.update((elem, 1))
    output_list.append(''.join((elem, str(counter[elem]))))

'*'.join(output_list)

输出:

'lesson1*lesson2*practice1*lesson3*quiz1*practice2'

【讨论】:

    猜你喜欢
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 2013-04-27
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多