lambda和字母数字单词的Python错误

时间:2016-08-11 19:57:34

标签: python python-3.x lambda

我是python的新手,现在我遇到了错误,不知道为什么会出现这个错误。

我有3个单词列表。列表包含单词数字,文字单词和字母数字单词。这些列表保存在txt文件中。每个文件都可以包含其他列表或新单词中的单词。

现在我想比较这些列表并将所有没有重复的单词复制到新列表中。所以我有一个大的列表,包含所有单词,但没有重复。

这是我的剧本:

file_a = raw_input("File 1?: ")
file_b = raw_input("File 2?: ")
file_c = raw_input("File_3?: ")
file_new = raw_input("Neue Datei: ")

def compare_files():

    with open(file_a, 'r') as a:
        with open(file_b, 'r') as b:
            with open(file_c, 'r') as c:
                with open(file_new, 'w') as new:
                    difference = set(a).symmetric_difference(b).symmetric_difference(c)
                    difference.discard('\n')
                    sortiert = sorted(difference, key=lambda item: (int(item.partition(' ')[0])
                                                                    if item[0].isdigit() else float('inf'), item))

                    for line in sortiert:
                        new.write(line)

k = compare_files()

当我运行脚本时,我收到以下错误消息:

Traceback (most recent call last):
  File "TestProject1.py", line 19, in <module>
    k = compare_files()
  File "TestProject1.py", line 13, in compare_files
    sortiert = sorted(difference, key=lambda item: (int(item.partition(' ')[0])
  File "TestProject1.py", line 14, in <lambda>
    if item[0].isdigit() else float('inf'), item))
ValueError: invalid literal for int() with base 10: '12234thl\n'

我的剧本中有任何想法或错误的人吗?

感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

partition上的' '或任何其他字符串不会提取字符串的数字部分,除非您知道紧跟数字后面的字符;非常不可能。

您可以改为使用正则表达式来提取字符串的前导数字部分:

import re

p = re.compile(r'^\d+')

def compare_files():

    with open(file_a, 'r') as a, open(file_b, 'r') as b, \
         open(file_c, 'r') as c, open(file_new, 'w') as new:
         difference = set(a).symmetric_difference(b).symmetric_difference(c)
         difference.discard('\n')
         sortiert = sorted(difference, 
                           key=lambda item: (int(p.match(item).group(0)) \
                                             if item[0].isdigit() \
                                             else float('inf'), item))

         for line in sortiert:
             new.write(line)

模式'^\d+'应匹配字符串开头的所有数字,然后p.match(item).group(0)将数字作为字符串返回,然后转换为整数。