- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个程序,我使用 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])
在 Windows 上使用 IDLE 时,我只需粘贴此文件的内容并按 Enter 键即可运行。
但是使用 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
我不知道该怎么办 - 对 I/O 有点无知。有什么帮助吗?
编辑说明:我认为我给出的两个不同的 bash 命令是等效的,但话又说回来,我是个菜鸟,所以解释它们为什么不同也会有所帮助。 .
为了消除歧义,这是一份 Algo 作业......(遗憾的是我了解算法,但不了解操作系统的低级细节)并且我需要有一个特定的输入和输出方案。例如
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 尝试将每一行解释为命令。我什至不能。
最佳答案
input()
的含义已改变。
在 Python 3.2 中:http://docs.python.org/py3k/library/functions.html#input
在 Python 2.7.2 中:http://docs.python.org/library/functions.html#input
通过两个小型测试程序,您可以更轻松地看到这一点。唯一的区别是一个使用 Python 2.7 解释器,另一个使用 Python 3.2 解释器:
$ cat input27.py
#!/usr/bin/python2.7
data = input("")
for l in data.split("\n"):
print(l)
$ cat input32.py
#!/usr/bin/python3.2
data = input("")
for l in data.split("\n"):
print(l)
$ ./input27.py < names.txt
Traceback (most recent call last):
File "./input27.py", line 2, in <module>
data = input("")
File "<string>", line 1
Victor Bertha Amy Diane Erika Clare
^
SyntaxError: invalid syntax
$ ./input32.py < names.txt
Victor Bertha Amy Diane Erika Clare
$
请注意,即使 Python 3.2 版本不会抛出错误,它也不会打印 names.txt
中的所有行。正如人们所预料的那样。
我不认为input()
方法值得使用。更容易使用新奇的 for line in file:
相反的方法:
$ cat fixed_input27.py
#!/usr/bin/python2.7
import sys
for line in sys.stdin:
print(line.split()[0])
$ cat fixed_input32.py
#!/usr/bin/python3.2
import sys
for line in sys.stdin:
print(line.split()[0])
$ ./fixed_input27.py < names.txt
Victor
Wyatt
Xavier
Yancey
Zeus
Amy
Bertha
Clare
Diane
Erika
$ ./fixed_input32.py < names.txt
Victor
Wyatt
Xavier
Yancey
Zeus
Amy
Bertha
Clare
Diane
Erika
$
(我从 names.txt
中删除了一个空行,因为它导致这个简单的程序抛出错误。这实际上不会成为您成熟的程序中的问题,因为您正确地处理了空行。)
我无法解释为什么input()
确实在Windows下工作,但是input()
感觉这是一个足够可怕的界面(谁认为通过 eval
运行用户提供的输入是一个好主意?!?天哪)只需重写它。
更新
好吧,我很感兴趣,一直想解决这个问题。我把你所有的调试代码都拿出来并改用 for l in sys.stdin:
方法:
$ ./GS.py
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
Wyatt Clare
Xavier Bertha
Yancey Erika
Zeus Diane
Victor Amy
$ cat GS.py
#!/usr/bin/python3.2
if __name__ == "__main__":
import sys
## 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
readingMen = True
for l in sys.stdin:
line = l.split()
if len(line) > 1:
newPerson = line[0]
newPersonPreferences = list()
for i in range(1,len(line)):
newPersonPreferences.append(line[i])
if readingMen:
men[newPerson] = newPersonPreferences
wife[newPerson] = 0
count[newPerson] = 0
freeMen.append(newPerson)
else:
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])
$
请注意,您必须点击 ^D
当您完成粘贴输入时,如果您以这种方式运行它。 (我非常更喜欢 IO 重定向 ./GS.py < names.txt
,但如果你的教授会复制和粘贴,那么请确保你的教授知道点击 ^D
来表示输入结束。)
关于python - 为什么这在 Windows 上的 Python 3 IDLE 中有效,而在 Ubuntu 上的终端中无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8413200/
我有一个奇怪的问题。根据像this这样的帖子我希望 IDLE 比在命令行上运行我的代码慢。然而,我看到完全相反的情况。 该程序比较两个文件并将匹配行配对在一起并将所有匹配项写入新文件。我认为它类似于
我使用 emacs-24.5.1 浏览了 linux 内核代码,并使用 cedet(内联在 emacs 中)进行语义解析。 经过一些常规配置后,我用emacs打开init/main.c,出现了“Par
我写的字符串很长。为了便于阅读,我想将文本换行到多行。这是怎么做到的。我以前看过说明,但现在找不到了。 最佳答案 [这个答案一般适用于 Python,并不特定于 IDLE。] 对于没有嵌入换行符的长字
是否有任何现有的网络应用程序可以让多个用户同时使用交互式 IDLE 类型 session ? 类似于: IDLE 2.6.4 Morgan: >>> letters = list("abcdefg")
我是编程新手,我决定先学Python,所以; 我安装了 Python,最新版本 3.4。我正在尝试打开 Python IDLE(GUI) 模式,所以当我打开时,我收到消息“IDLE 的子进程没有建立连
最近很多用户发现system idle process占用率特别高,不知道什么意思,想要解决它。这个只是显示电脑剩余内存的,下面来看看想想的介绍吧。 system idle process占用率高
默认的 ATL 简单对象在其 IDL 文件的顶部具有以下内容: import "oaidl.idl"; import "ocidl.idl"; 这些文件有什么用,我怎么知道什么时候需要导入它们?是否有
这个问题在这里已经有了答案: How to clear the interpreter console? (30 个答案) 关闭 9 年前。 我正在运行一个脚本,该脚本使用的模块会在屏幕上打印很多内
这里 TP_DSCVoyChange 类有 KEY_DSC作为一个属性,我们要填充此 KEY_DSC 使用 TP_DSCVoyChange 使用 String 值从 Java 获取值构造函数。例如。
在我的 Mac 上,我通过自制软件安装了 python 3.9。 我尝试启动空闲并收到此错误: > idle3 ** IDLE can't import Tkinter. Your Python ma
我正在使用 this用于检测用户在我的应用程序中是否空闲的库。我正在使用 StartWatching(),在 onTimerStart 中,我现在只是打印控制台。 当用户空闲 N 秒时,onTimer
我们有一个 .NET 程序集(实际上是 Aspose.Words),我们希望客户端能够轻松地从 COM 客户端使用它。 因此,我们随程序集提供了 .TLB,以便客户端可以通过 C++ 或 Delphi
在之前的函数中,我创建并返回了一个哈希值。执行此操作后,它将哈希作为结构返回,我将其用作此以下函数的输入。 myStruct 的每个标签都是一个结构,每个都有一个名称和数据类型标签。 我正在尝试遍历每
假设我创建了以下 IDL 文件: module ProviderTest { interface Multiplier { long twice(in long number)
我有一个IDL文件,我使用scipy中的readsav将其导入Python,我更改了文件中的参数,我想将其导出/保存回原始格式,IDL可读。 这就是我导入它的方式: from scipy.io.idl
我正在尝试替换/删除文本文档中的一些行。该文档采用 ISO-8859-1 字符编码。 当我尝试将此行复制到我的 Python 脚本中进行替换时,它不会匹配。如果我缩短该行并删除直到第一个双引号 "它将
我的 Espresso 测试在 Espresso 版本 2.2.2 上运行良好,但是当我将我的工作室更新到最新版本并应用迁移规则时,测试将失败并需要更新版本。 库使用 androidTestImple
2013 年 4 月 15 日决议。 在 Windows 7(64 位)Windows 资源管理器中,当我右键单击 Python 文件并选择“使用 IDLE 编辑”时,编辑器会正确打开,但是当我运行(
我用的是3.8.10版本的Python.(32位)。我正在尝试在IDLE中导入NumPy包,但是我收到了这个消息。图像。我的Idle崩溃了,并显示以下信息。同样的事情也发生在其他包上,比如:Chain
IDL是什么意思?我用谷歌搜索了一下,发现它代表接口(interface)定义语言,用于组件的接口(interface)定义。但是,在实践中,IDL 的目的是什么?微软使用它吗? 最佳答案 接口(in
我是一名优秀的程序员,十分优秀!