2012-03-28 58 views
2

我对Python很新,但我认为我赶上了。在python中使用条件变量字符串

无论如何,我正在制定一个计划(不是为了上课,而是为了帮助我)并且遇到了问题。

我试图记录一些事情的清单,我的意思是接近一千的事情,有一些重复。所以我的问题是这样的:

我不想在列表中添加多余的名称,而是我只想在它之前(或之后,取其较简单的地方)添加一个2x或3x,然后将其写入txt文档。

我很喜欢阅读和写文本文件,但我唯一的问题是条件声明,我不知道如何写它,我也不能在网上找到它。

for lines in list_of_things: 
    if(lines=="XXXX x (name of object here)"): 

然后根据if语句。我唯一的问题是,“XXXX”可以用任何字符串编号替换,但我不知道如何在字符串中包含变量,如果这是有道理的。即使它变成了一个int,我仍然不知道如何在一个条件中使用一个变量。

我能想到的唯一的事情就是制作多个if语句,这会很长。

有什么建议吗?我为文本的墙壁道歉。

+0

为了澄清,你是否说你有一个潜在的冗余线源,并最终你想输出以数字为前缀的唯一行?另外,命令重要吗? – jdi 2012-03-28 17:43:29

回答

5

我建议遍历输入文件中的行,并在字典中插入一个关键为您找到每个人,然后在递增值对于您在其中找到的每个值的每个实例,都要使用该关键字,然后从该字典中生成输出文件。

catalog = {} 
for line in input_file: 
    if line in catalog: 
     catalog[line] += 1 
    else: 
     catalog[line] = 1 

或者

from collections import defaultdict 
catalog = defaultdict(int) 
for line in input_file: 
    catalog[line] += 1 

然后,只需通过字典运行,并打印出来的文件。

+0

我想这是他问的。和我刚才提议的一样。 – jdi 2012-03-28 17:45:07

+1

@NolenRoyalty:最终我会建议它,但它应该是一个附加位的信息,首先解释标准字典的方式后,因为他是一个新的Python程序员。 – jdi 2012-03-28 17:58:33

+0

@jdi足够公平,解决方案无论如何都是正确的(假设我们已经正确理解了这个问题)。 – 2012-03-28 17:59:36

1

你可能会寻找regular expressions和类似

for line in text: 
    match = re.match(r'(\d+) x (.*)', line) 
    if match: 
     count = int(match.group(1)) 
     object_name = match.group(2) 
     ... 
+0

我意识到OP显示的模式真的是一种尴尬的方法来计算线条,而且他已经将这些字符串预先格式化了,因为他摄入了这些字符串,然后想要对它们进行重新分析。 – jdi 2012-03-28 17:45:52

0

这应做到:

a = [1,1,1,1,2,2,2,2,3,3,4,5,5] 
from itertools import groupby 
print ["%dx %s" % (len(list(group)), key) for key, group in groupby(a)] 
+1

特别是在OP被公认为是一个新的Python程序员的时候,你应该对这个答案稍微不太熟悉。 – jdi 2012-03-28 17:57:37

+0

他说他抓得很快:)呵呵我很抱歉,如果这太高级了,我只希望它对OP有帮助,但请记住,这是一个公开的问答环节,而不是初学者的人可能会迟来。 – Trufa 2012-03-28 18:05:30

+0

那么如果你要推荐一些先进的东西,至少要修正它,所以它不使用常量字符串连接:'[“%dx%s”%(len(list(group)),key)for key,group in groupby(a)]' – jdi 2012-03-28 18:10:20

0

像这样的事情?

list_of_things=['XXXX 1', 'YYYY 1', 'ZZZZ 1', 'AAAA 1', 'ZZZZ 2'] 

for line in list_of_things: 
    for e in ['ZZZZ','YYYY']: 
     if e in line: 
      print line 

输出:

YYYY 1 
ZZZZ 1 
ZZZZ 2 

您还可以使用if line.startswith(e):或正则表达式(如果我理解你的问题...)

0

要在一个字符串变量,可以使用format()

 
>>> i = 123 
>>> s = "This is an example {0}".format(i) 
>>> s 
'This is an example 123' 

在这种情况下,{0}指示你会在那里设置一个变量。如果你有更多的变量,使用"This is an example {0} and more {1}".format(i, j)"(所以每个变量的数字,从0开始)。

0

有两种方法可以解决这个问题。 1)像的使用字典来捕获项的计数,然后列表的每个项目具有其计格式化以下

list_of_things = ['sun', 'moon', 'green', 'grey', 'sun', 'grass', 'green'] 
listItemCount = {} 
countedList = [] 
for lines in list_of_thing: 
    if lines in listItemCount: 
     listItemCount[lines] += 1 
    else: 
     listItemCount[lines] = 1 
for id in listItemCount: 
    if listItemCount[id] > 1: 
     countedList.append(id+' - x'str(listItemCount[id])) 
    else: 
     countedList.append(id) 
for item in countedList: 
    print(item) 

的输出上面会

sun - x2 
grass 
green - x2 
grey 
moon 

或2)使用集合使事情更加简单如下所示

import collections 

list_of_things = ['sun', 'moon', 'green', 'grey', 'sun', 'grass', 'green'] 
listItemCount = collections.Counter(list_of_things) 
listItemCountDict = dict(listItemCount) 
countedList = [] 
for id in listItemCountDict: 
    if listItemCountDict[id] > 1: 
     countedList.append(id+' - x'str(listItemCountDict[id])) 
    else: 
     countedList.append(id) 
for item in countedList: 
    print(item) 

的输出上面会

sun - x2 
grass 
green - x2 
grey 
moon