Использование условных выражений с переменными строками в Python - PullRequest
2 голосов
/ 28 марта 2012

Я довольно новичок в python, но думаю, что поймал быстро.

В любом случае, я делаю программу (не для класса, но чтобы помочь мне) и столкнулся с проблемой.

Я пытаюсь документировать список вещей, иЯ имею в виду почти тысячу таких вещей, причем некоторые повторяются.Итак, моя проблема заключается в следующем:

Я не хотел бы добавлять избыточные имена в список, вместо этого я просто хотел бы добавить 2x или 3x до (или после, в зависимости от того, что проще), а затем написать, чток текстовому документу.

Я в порядке с чтением и записью из текстовых документов, но моя единственная проблема - это условное утверждение, я не знаю, как его написать и не могу найти его в Интернете.

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

И то, что в соответствии с оператором if.Моя единственная проблема заключается в том, что «XXXX» можно заменить любым номером строки, но я не знаю, как включить переменную в строку, если это имеет смысл.Даже если оно превращается в int, я все еще не знаю, как использовать переменную в условном выражении.

Единственное, о чем я могу думать, - это сделать несколько операторов if, что было бы очень длинным.

Есть предложения?Я прошу прощения за стену текста.

Ответы [ 6 ]

5 голосов
/ 28 марта 2012

Я бы предложил зацикливать строки во входном файле и вставлять ключ в словарь для каждого найденного вами значения, затем увеличивать значение ключа на единицу для каждого экземпляра значения, которое вы найдете после этого, а затем генерироватьвыходной файл из этого словаря.

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

Затем просто выполните этот диктовку и распечатайте его в файл.

1 голос
/ 28 марта 2012

Возможно, вы ищете регулярные выражения и что-то вроде

for line in text:
    match = re.match(r'(\d+) x (.*)', line)
    if match:
        count = int(match.group(1))
        object_name = match.group(2)
        ...
0 голосов
/ 28 марта 2012

Для этого есть два варианта.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
0 голосов
/ 28 марта 2012

Чтобы включить переменную в строку, используйте 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 голосов
/ 28 марта 2012

Как то так?

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 голосов
/ 28 марта 2012

Это должно сделать это:

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)]
...