社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

需要有关python 3.7的简单脚本的帮助[duplicate]

Nate Millen • 4 年前 • 1370 次点击  

我正在尝试创建一个函数,将多个变量与一个整数进行比较,并输出一个由三个字母组成的字符串。我想知道是否有办法把它翻译成Python。所以说:

x = 0
y = 1
z = 3
mylist = []

if x or y or z == 0 :
    mylist.append("c")
if x or y or z == 1 :
    mylist.append("d")
if x or y or z == 2 :
    mylist.append("e")
if x or y or z == 3 : 
    mylist.append("f")

它将返回一个列表

["c", "d", "f"]

有可能吗?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/50368
 
1370 次点击  
文章 [ 24 ]  |  最新文章 4 年前
fhgd
Reply   •   1 楼
fhgd    4 年前

问题

而测试多个值的模式

>>> 2 in {1, 2, 3}
True
>>> 5 in {1, 2, 3}
False

是非常可读的,并且在许多情况下工作,有一个陷阱:

>>> 0 in {True, False}
True

但我们希望

>>> (0 is True) or (0 is False)
False

解决方案

前一个表达式的一个泛化是基于 ytpillai :

>>> any([0 is True, 0 is False])
False

可以写成

>>> any(0 is item for item in (True, False))
False

虽然此表达式返回正确的结果,但其可读性不如第一个表达式:-(

Karan Shah Mayur
Reply   •   2 楼
Karan Shah Mayur    5 年前

这对你有帮助。

def test_fun(val):
    x = 0
    y = 1
    z = 2
    myList = []
    if val in (x, y, z) and val == 0:
        myList.append("C")
    if val in (x, y, z) and val == 1:
        myList.append("D")
    if val in (x, y, z) and val == 2:
        myList.append("E")

test_fun(2);
Serhii
Reply   •   3 楼
Serhii    4 年前

你可以联合起来

x = 0
y = 1
z = 3

在一个变量中。

In [1]: xyz = (0,1,3,) 
In [2]: mylist = []

将我们的条件更改为:

In [3]: if 0 in xyz: 
    ...:     mylist.append("c") 
    ...: if 1 in xyz: 
    ...:     mylist.append("d") 
    ...: if 2 in xyz: 
    ...:     mylist.append("e") 
    ...: if 3 in xyz:  
    ...:     mylist.append("f") 

输出:

In [21]: mylist                                                                                
Out[21]: ['c', 'd', 'f']
Massifox
Reply   •   4 楼
Massifox    4 年前

如果没有dict,请尝试以下解决方案:

x, y, z = 0, 1, 3    
offset = ord('c')
[chr(i + offset) for i in (x,y,z)]

并给出:

['c', 'd', 'f']
Rohit Gawas
Reply   •   5 楼
Rohit Gawas    5 年前

您可以使用字典:

x = 0
y = 1
z = 3
list=[]
dict = {0: 'c', 1: 'd', 2: 'e', 3: 'f'}
if x in dict:
    list.append(dict[x])
else:
    pass

if y in dict:
    list.append(dict[y])
else:
    pass
if z in dict:
    list.append(dict[z])
else:
    pass

print list
alamin
Reply   •   6 楼
alamin    5 年前

要用一个值测试多个变量: if 1 in {a,b,c}:

要使用一个变量测试多个值: if a in {1, 2, 3}:

firelynx
Reply   •   7 楼
firelynx    5 年前

你好像在造凯撒密码。

更普遍的方法是:

input_values = (0, 1, 3)
origo = ord('c')
[chr(val + origo) for val in inputs]

输出

['c', 'd', 'f']

不确定这是否是您的代码所期望的副作用,但输出的顺序将始终被排序。

如果这是您想要的,最后一行可以更改为:

sorted([chr(val + origo) for val in inputs])
rsalmei
Reply   •   8 楼
rsalmei    5 年前

在Python中表示伪代码的最容易记忆的方法是:

x = 0
y = 1
z = 3
mylist = []

if any(v == 0 for v in (x, y, z)):
    mylist.append("c")
if any(v == 1 for v in (x, y, z)):
    mylist.append("d")
if any(v == 2 for v in (x, y, z)):
    mylist.append("e")
if any(v == 3 for v in (x, y, z)):
    mylist.append("f")
Seenivasan
Reply   •   9 楼
Seenivasan    5 年前

做起来很容易

for value in [var1,var2,var3]:
     li.append("targetValue")
tripleee Sergei
Reply   •   10 楼
tripleee Sergei    5 年前

也许你需要直接公式来设置输出位。

x=0 or y=0 or z=0   is equivalent to x*y*z = 0

x=1 or y=1 or z=1   is equivalent to (x-1)*(y-1)*(z-1)=0

x=2 or y=2 or z=2   is equivalent to (x-2)*(y-2)*(z-2)=0

让我们映射到位: 'c':1 'd':0xb10 'e':0xb100 'f':0xb1000

is c(is‘c’)的关系:

if xyz=0 then isc=1 else isc=0

使用数学公式 https://youtu.be/KAdKCgBGK0k?list=PLnI9xbPdZUAmUL8htSl6vToPQRRN3hhFp&t=315

[c]: (xyz=0 and isc=1) or (((xyz=0 and isc=1) or (isc=0)) and (isc=0))

[d]: ((x-1)(y-1)(z-1)=0 and isc=2) or (((xyz=0 and isd=2) or (isc=0)) and (isc=0))

...

通过以下逻辑连接这些公式:

  • 逻辑 and 是方程的平方和
  • 逻辑 or 是方程式的乘积

你会得到一个总方程 求和,你有求和的总公式

那么sum&1是c,sum&2是d,sum&4是e,sum&5是f

在此之后,您可以形成预定义的数组,其中字符串元素的索引将对应于就绪字符串。

array[sum] 给你绳子。

Siddharth Satpathy
Reply   •   11 楼
Siddharth Satpathy    5 年前

您可以尝试下面所示的方法。在此方法中,您可以自由指定/输入要输入的变量数。

mydict = {0:"c", 1:"d", 2:"e", 3:"f"}
mylist= []

num_var = int(raw_input("How many variables? ")) #Enter 3 when asked for input.

for i in range(num_var): 
    ''' Enter 0 as first input, 1 as second input and 3 as third input.'''
    globals()['var'+str('i').zfill(3)] = int(raw_input("Enter an integer between 0 and 3 "))
    mylist += mydict[globals()['var'+str('i').zfill(3)]]

print mylist
>>> ['c', 'd', 'f']
Vinayak Kaniyarakkal
Reply   •   12 楼
Vinayak Kaniyarakkal    6 年前

单线解决方案:

mylist = [{0: 'c', 1: 'd', 2: 'e', 3: 'f'}[i] for i in [0, 1, 2, 3] if i in (x, y, z)]

或:

mylist = ['cdef'[i] for i in range(4) if i in (x, y, z)]
michael zxc858
Reply   •   13 楼
michael zxc858    8 年前

此代码可能有帮助

L ={x, y, z}
T= ((0,"c"),(1,"d"),(2,"e"),(3,"f"),)
List2=[]
for t in T :
if t[0] in L :
    List2.append(t[1])
    break;
Saksham Varma
Reply   •   14 楼
Saksham Varma    9 年前
d = {0:'c', 1:'d', 2:'e', 3: 'f'}
x, y, z = (0, 1, 3)
print [v for (k,v) in d.items() if x==k or y==k or z==k]
Vishvajit Pathak hamid
Reply   •   15 楼
Vishvajit Pathak hamid    5 年前

如果要使用If、else语句,则以下是另一种解决方案:

myList = []
aList = [0, 1, 3]

for l in aList:
    if l==0: myList.append('c')
    elif l==1: myList.append('d')
    elif l==2: myList.append('e')
    elif l==3: myList.append('f')

print(myList)
Vishvajit Pathak hamid
Reply   •   16 楼
Vishvajit Pathak hamid    5 年前

这里提供的所有优秀答案都集中在原海报的具体要求上,并集中在 if 1 in {x,y,z} 由Martijn Pieters提出的解决方案。
他们忽略的是这个问题更广泛的含义:
如何针对多个值测试一个变量?
如果使用字符串,例如:
测试字符串“Wild”是否有多个值

>>> x = "Wild things"
>>> y = "throttle it back"
>>> z = "in the beginning"
>>> if "Wild" in {x, y, z}: print (True)
... 

>>> x = "Wild things"
>>> y = "throttle it back"
>>> z = "in the beginning"
>>> if "Wild" in [x, y, z]: print (True)
... 

在这种情况下,最容易转换为字符串

>>> [x, y, z]
['Wild things', 'throttle it back', 'in the beginning']
>>> {x, y, z}
{'in the beginning', 'throttle it back', 'Wild things'}
>>> 

>>> if "Wild" in str([x, y, z]): print (True)
... 
True
>>> if "Wild" in str({x, y, z}): print (True)
... 
True

但是,正如 @codeforester ,使用此方法将丢失单词边界,如:

>>> x=['Wild things', 'throttle it back', 'in the beginning']
>>> if "rot" in str(x): print(True)
... 
True

三个字母 rot 在列表中确实存在组合,但不作为单个单词存在。测试“rot”将失败,但如果其中一个列表项是“rot in hell”,那也将失败。
结果是,如果使用此方法,请小心搜索条件,并注意它确实有此限制。

B. M.
Reply   •   17 楼
B. M.    6 年前

Set是一个很好的方法,因为它对变量进行排序,这似乎是你的目标。 {z,y,x} {0,1,3} 不管参数的顺序如何。

>>> ["cdef"[i] for i in {z,x,y}]
['c', 'd', 'f']

这样,整个解是O(n)。

shuttle87 Bhargav Boda
Reply   •   18 楼
shuttle87 Bhargav Boda    9 年前

我想这会处理得更好:

my_dict = {0: "c", 1: "d", 2: "e", 3: "f"}

def validate(x, y, z):
    for ele in [x, y, z]:
        if ele in my_dict.keys():
            return my_dict[ele]

输出:

print validate(0, 8, 9)
c
print validate(9, 8, 9)
None
print validate(9, 8, 2)
e
GuiltyDolphin
Reply   •   19 楼
GuiltyDolphin    9 年前

要检查值是否包含在一组变量中,可以使用内置模块 itertools operator .

例如:

进口:

from itertools import repeat
from operator import contains

声明变量:

x = 0
y = 1
z = 3

创建值映射(按要检查的顺序):

check_values = (0, 1, 3)

使用 itertools公司 允许变量重复:

check_vars = repeat((x, y, z))

最后,使用 map 创建迭代器的函数:

checker = map(contains, check_vars, check_values)

然后,在检查值(按原始顺序)时,使用 next() :

if next(checker)  # Checks for 0
    # Do something
    pass
elif next(checker)  # Checks for 1
    # Do something
    pass

等。。。

这比 lambda x: x in (variables) 因为 操作人员 是一个内置模块,比使用 lambda 它必须创建一个自定义就地函数。

另一个用于检查列表中是否存在非零(或False)值的选项:

not (x and y and z)

等价物:

not all((x, y, z))
ytpillai
Reply   •   20 楼
ytpillai    8 年前

如果您非常懒,可以将值放入数组中。例如

list = []
list.append(x)
list.append(y)
list.append(z)
nums = [add numbers here]
letters = [add corresponding letters here]
for index in range(len(nums)):
    for obj in list:
        if obj == num[index]:
            MyList.append(letters[index])
            break

你也可以把数字和字母放进字典里,但这可能比简单的if语句复杂得多。这就是你试图变得格外懒惰的原因:)

还有一件事,你的

if x or y or z == 0:

将编译,但不是按您希望的方式编译。当您简单地将变量放入if语句中时(示例)

if b

程序将检查变量是否不为空。写上述语句的另一种方法(更有意义)是

if bool(b)

Bool是python中的一个内置函数,它基本上执行验证boolean语句的命令(如果您不知道这是什么,这就是您现在试图在If语句中生成的:)

我发现另一个懒惰的方法是:

if any([x==0, y==0, z==0])