Hear me out, I do not simply want someone to solve this problem for me. I know it is not 100% complete yet, but currently when I run the program I get an error about "Can't convert 'list' object to str implicitly" I'm looking for help on how to fix this and why it is does this.
Here is the problem
Write code to print out each thing in the list of lists, L, with a '*' after it like
1*2*3*4*...8*a*b*c*d*
This requires knowing the print statement and using the end or sep argument option
Here is my list, sorry for not putting it in earlier
L = [[1,2,3,4],[5,6,7,8],['a','b','c','d']]
Here is my code at the moment
def ball(x): #random function name with one parameter
q = '' #
i = 0
if type(x) != list: #verifies input is a list
return"Error"
for i in x: #Looks at each variable in list
for j in i: #Goes into second layer of lists
q = q + j + '*'
print(q)
The reason for your error
"Can't convert 'list' object to str implicitly"
is that you're using the wrong variable in your nested for loops. Where you're concatenating values to your q variable, you mistakenly put q = q + i when you wanted q = q + j. You also will want to cast the value of j as a string so it can be concatenated with q. In order to get your desired output, you can simply add an asterisk into that statement - something like the following: q = q + str(j) + '*'. On a completely unrelated note, your else statement that just has "Mistake" in it should be removed completely - it doesn't follow an if and it doesn't actually return or assign to a variable.
Note that this is not the most elegant way to go about solving this problem. I agree with ilent2 that you should take a look at both list comprehension and the str.join() method.
If you have a list of strings,
myList = ['a', '123', 'another', 'and another']
You can join them using the str.join function:
Help on method_descriptor:
join(...)
S.join(iterable) -> string
Return a string which is the concatenation of the strings in the
iterable. The separator between elements is S.
myString = '#'.join(myList)
If your list contains mixed types or non-strings you need to convert each item to a string first:
anotherList = [1, 2, 'asdf', 'bwsg']
anotherString = '*'.join([str(s) for s in anotherList])
You might want to read about list comprehension or more about the join function. Note, the above doesn't print the output (unless you are using the interactive console), if you want the output to be printed you will need call print too
print myString
print anotherString
And, if you are working with lists-of-lists you may need to change how you convert each sub-list into a string (depending on your desired output):
myListList = [[1, 2, 3, 4], [2, 3, 6, 5], [6, 4, 3, 1]]
myOtherString = '#'.join(['*'.join([str(s) for s in a]) for a in myListList])
The last line is a little complicated to read, you might want to rewrite it as a nested for loop instead.
Related
I'm working on a project in which I must create some objects for this use a dictionary in which the objects are saved with their identifier, now, I need that only appears the attribute of the objects, without needing the identifier, for this convert the values of the dictionary in a list, but I can not remove things like [ ] or give line breaks
my code is:
class myclass():
def __init__(self, x):
self.x = x
list_obj = []
list_attrs = []
list_values = []
for i in range (3):
obj = myclass(' U')
y= list_obj.append(obj)
b=list(y.b())
list_values.append(b)
print(list_values)
my output is:
['U'], ['U'], ['U']]
Any idea how to do this?.I tried to use strip but it doesn't give me the desired result or I even thought of converting the whole list into a string and maybe I could do it, but I can't get it.
The problem is that you are not printing a string, you are printing a list. Python print has a built in feature to print list like that. To format list in other ways you can check out this https://www.geeksforgeeks.org/print-lists-in-python-4-different-ways/
One way to do what you want:
for v in list_values:
print(*v, sep='\n')
First flatten the list, then combine each element of the list with a line break as an seperator. You get a string, and if you print it it looks like you expect it.
lst = [['Ultra1', 'Max1', 3], ['Ultra2', 'Max2', 3], ['Ultra3', 'Max3', 3]]
string = "\n".join([str(item) for sublist in lst for item in sublist])
print(string)
Why am I seeing this output while running this code:
list = []
for i in range(4):
l = int(input())
list.append(l)
print(str(list))
print("+".join(str(list)))
Output:
[1, 2, 3, 4]
[+1+,+ +2+,+ +3+,+ +4+]
Expected = [1+2+3+4]
Please correct my syntax
separator.join(sequence) inserts separator between each item in sequence; if sequence is a string, it simply sticks the separator in between every character of the string.
I think the root of your confusion is that you're converting the list into a string, when it seems like you really want to turn each item into a string (so that the list of strings can then be joined).
lst = [1, 2, 3, 4]
list_as_string = str(lst)
print(list_as_string)
=> "[1, 2, 3, 4]"
To make each item in the list a string, you can use a list comprehension. (List comprehensions are very useful Python tools for applying the same operation to each item in a sequence; if you haven't used them, check out this tutorial.)
list_of_strings = [str(i) for i in lst]
print(list_of_strings)
=> ["1", "2", "3", "4"]
The result of that can be joined like you would expect (and you can add brackets).
output = "[" + "+".join(list_of_strings) + "]"
print(output)
=> "[1+2+3+4]"
Alternatively, if for some reason you definitely want to convert the list to a string first, you can use the string.replace(old, new) method to simply replace every ", " with "+".
print(list_as_string.replace(", ", "+"))
=> "[1+2+3+4]"
Also note that list in Python is the actual name of the list class and it is a bad habit to redefine it as an ordinary variable.
You could use split(",") and "+".join().Also use .strip to remove the blank space.
Try this below:
print("+".join(map(str.strip, str(list).split(","))))
Result:
[1+2+3+4]
a=[2]
a.append(3)
print (a)
result is [2, 3].
I want to have a output 23 instead of [2,3]. Any suggestions?
When you do something like a = [2] in Python, it creates a list out of it with one element 2 in the list.
You seemingly want string operations. There are two ways to do this. Firstly,
a = '2'
a = a + '3'
print (a)
Another way, probably the one which you're looking for, is converting the list into a string, as follows.
a = [2]
a.append(3)
b = ''.join(str(x) for x in a)
print (b)
Here is a brief explanation of the second approach:
You forcibly typecast each element of the list a to string, and then use join method to convert the list to string. Essentially, first the list [2, 3] is converted to ['2', '3'] and then join is used.
Edit:
Another approach, to better explain what I said above,
a = [str(2)]
a.append(str(3))
b = ''.join(a)
print (b)
Since the numbers are stored as ints instead of strings it makes it slightly more difficult as you will need to cast them to strings.
a=[2]
a.append(3)
print("".join(str(x) for x in a))
This will give your desired output. If you want the output to be an int then you can just cast it back.
l = [1,2,3,4,5,'1','2','3','4','nag','nag','venkat',5,6,7]
l1 = []
for i in l:
if (str(i) not in l1) and (i not in l1):
l1.append(i)
print l1
I want to clean my list. My list contains numbers and strings. In the above list l i have both 1 and "1". I want to remove either 1 or "1". I want the output as [1, 2, 3, 4, 5, "nag", "venkat", 6, 7]
Confirmed in IDLE that this provides the output you're looking for. Also, I updated the names of some of your variables to be a little easier to understand.
my_list = [1,2,3,4,5,'1','2','3','4','nag','nag','venkat',5,6,7]
output_list = []
for i in my_list:
try:
if (str(i) not in output_list) and (int(i) not in output_list):
output_list.append(i)
except ValueError:
if i not in output_list:
output_list.append(i)
print output_list
In Python it's common practice to use variables assuming that they're a certain type and just catch errors, instead of going through the process of checking the type (int, str, etc) on each one. Here, inside the try statement, I'm assuming the loop variable i is either an int or a str that contains only numbers. Provided that's the case, this section works fine.
However, we know that the list contains some strings of letters, so the try block will throw a ValueError. The except block catches that and, knowing that this error will result from an attempt to cast a string of letters as an int (when we use int(i)), we can now safely assume that the loop variable i refers to a string of letters, which we then check against the output_list and append if needed. I hope that helps.
There's a way with list comprehensions, you create a new list, but this example only works if you know what you want to remove:
l1 = [i for i in l if i != "1" if i != "2" if i != "3" if i != "4"]
#output
[1, 2, 3, 4, 5, 'nag', 'nag', 'venkat', 5, 6, 7]
or for example only removing the string "1" it would be
l1 = [i for i in l if i != "1"]
Maybe it could be implemented in a function and a loop to remove such elements with a single if statement with this way. Not sure, anyway I'd go with coralv's way.
I am having trouble with list comprehension in Python
Basically I have code that looks like this
output = []
for i, num in enumerate(test):
loss_ = do something
test_ = do something else
output.append(sum(loss_*test_)/float(sum(loss_)))
How can I write this using list comprehension such as:
[sum(loss_*test_)/float(sum(loss_))) for i, num in enumerate(test)]
however I don't know how to assign the values of loss_ and test_
You can use a nested list comprehension to define those values:
output = [sum(loss_*test_)/float(sum(loss_))
for loss_, test_ in ((do something, do something else)
for i, num in enumerate(test))]
Of course, whether that's any more readable is another question.
As Yaroslav mentioned in the comments, list comprehensions don't allow you to save a value into a variable directly.
However it allows you to use functions.
I've made a very basic example (because the sample you provided is incomplete to test), but it should show how you can still execute code in a list comprehension.
def loss():
print "loss"
return 1
def test():
print "test"
return 5
output = [loss()*test() for i in range(10) ]
print output
which is this case will result in a list [5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
I hope this somehow shows how you could end up with the behaviour that you were looking for.
ip_list = string.split(" ") # split the string to a list using space seperator
for i in range(len(ip_list)): # len(ip_list) returns the number of items in the list - 4
# range(4) resolved to 0, 1, 2, 3
if (i % 2 == 0): ip_list[i] += "-" # if i is even number - concatenate hyphen to the current IP string
else: ip_list[i] += "," # otherwize concatenate comma
print("".join(ip_list)[:-1]) # "".join(ip_list) - join the list back to a string
# [:-1] trim the last character of the result (the extra comma)