У меня есть программа, в которой я использую input()
для ввода данных из STDIN.
Я использую ввод, чтобы прочитать первое слово из строки и использовать его как ключ словаря, при этом каждое последующее слово добавляется в список, который является значением упомянутого ключа.
Ввод в файл names.txt
:
Victor Bertha Amy Diane Erika Clare
Wyatt Diane Bertha Amy Clare Erika
Xavier Bertha Erika Clare Diane Amy
Yancey Amy Diane Clare Bertha Erika
Zeus Bertha Diane Amy Erika Clare
Amy Zeus Victor Wyatt Yancey Xavier
Bertha Xavier Wyatt Yancey Victor Zeus
Clare Wyatt Xavier Yancey Zeus Victor
Diane Victor Zeus Yancey Xavier Wyatt
Erika Yancey Wyatt Zeus Xavier Victor
Так, например, men["Victor"] = ["Bertha","Amy","Diane","Erika","Clare"]
.
Код находится в файле GS.py
(реализация Gale-Shapley):
if __name__ == "__main__":
## Data Dictionary
''' Name : Preferences '''
men = dict()
women = dict()
''' List of unmatched men '''
freeMen = list()
''' Name : How far down in preferences '''
count = dict()
''' Name : Current Match '''
wife = dict()
husband = dict()
## Reading Input
data = input("").split("\n")
print(data)
readingMen = True
for l in data:
line = l.split()
print(line)
if len(line) > 1:
newPerson = line[0]
newPersonPreferences = list()
for i in range(1,len(line)):
newPersonPreferences.append(line[i])
if readingMen:
print("man")
print(newPersonPreferences)
men[newPerson] = newPersonPreferences
wife[newPerson] = 0
count[newPerson] = 0
freeMen.append(newPerson)
else:
print("woman")
print(newPersonPreferences)
women[newPerson] = newPersonPreferences
husband[newPerson] = 0
elif len(line) == 1:
raise IOError(l + "\nis an invalid line.")
else:
readingMen = False
## Proposing
while len(freeMen) != 0:
m = freeMen[0]
w = men[m][count[m]]
count[m] += 1
if husband[w] == 0:
husband[w] = m
wife[m] = w
freeMen.remove(m)
else:
try:
if women[w].index(husband[w], women[w].index(m)):
freeMen.append(husband[w])
wife[husband[w]] = 0
husband[w] = m
wife[m] = w
freeMen.remove(m)
except ValueError:
pass
## Match Printing
print()
for m in wife:
print(m, wife[m])
При использовании IDLE в Windows я просто вставляю содержимое этого файла и нажимаю ввод, и он работает.
Но используя Ubuntu, я делаю python3 GS.py < names.txt
и получаю это:
me@glados:~$ python3 GS.py < names.txt
['Victor Bertha Amy Diane Erika Clare']
['Victor', 'Bertha', 'Amy', 'Diane', 'Erika', 'Clare']
man
['Bertha', 'Amy', 'Diane', 'Erika', 'Clare']
Traceback (most recent call last):
File "GS.py", line 83, in <module>
if husband[w] == 0:
KeyError: 'Bertha'
(отредактировано) Теперь, когда я делаю cat names.txt | python3 GS.py
, я получаю это:
ajg9132@glados:~$ cat names.txt | python GS.py
Traceback (most recent call last):
File "GS.py", line 50, in <module>
data = input("").split("\n")
File "<string>", line 1
Victor Bertha Amy Diane Erika Clare
^
SyntaxError: invalid syntax
Я понятия не имею, что делать - как-то неосведомлен относительно ввода / вывода. Любая помощь?
Редактировать заметку: Я думал, что две разные команды bash, которые я дал, были эквивалентны, но опять же, я полный нуб, поэтому объяснение, почему они разные, тоже поможет ...
Чтобы прояснить неоднозначность, это для домашней работы Алго ... (грустно, что я понимаю алгоритм, но не детали низкоуровневой ОС), и мне нужно иметь конкретную схему ввода и вывода. например,
spock $ java GS
Victor Bertha Amy Diane Erika Clare
Wyatt Diane Bertha Amy Clare Erika
Xavier Bertha Erika Clare Diane Amy
Yancey Amy Diane Clare Bertha Erika
Zeus Bertha Diane Amy Erika Clare
Amy Zeus Victor Wyatt Yancey Xavier
Bertha Xavier Wyatt Yancey Victor Zeus
Clare Wyatt Xavier Yancey Zeus Victor
Diane Victor Zeus Yancey Xavier Wyatt
Erika Yancey Wyatt Zeus Xavier Victor
Victor Amy
Wyatt Clare
Xavier Bertha
Yancy Erika
Zeus Diane
spock $
Единственная причина, по которой я этого не делал, заключалась в том, что вставка нескольких строк текста в PuTTY заставила bash интерпретировать каждую строку как команду. Я даже не могу.